LECTORES.C
#include "rshmem.h"
#include <string.h>
#include <stdio.h>
int main(int argc, char *argv[]){
/*DECLARACION DE VARIABLES*/
int contador=0;
FILE *fpl,*fpe;
int i,n;
char texto [250],c;
int mutex_s; /*semáforo 1*/
int mutex_w; /*semáforo 2*/
key_t claveMutex_s; /*clave semáforo 1*/
key_t claveMutex_w; /*clave semáforo 2*/
/*CONTROL DEL PASO DE ARGUMENTOS*/
if(argc!=2){
fprintf(stderr,"main:error en el paso de argumentos\n");
exit(3);
}
/*obtener una clave cualquiera para el recurso ipc*/
if((key_t)-1==(claveMutex_s = ftok("lectores.c",'s'))){
fprintf(stderr,"main:Error al crear la clave con ftok\n");
exit(1);
}
if((key_t)-1==(claveMutex_w = ftok("lectores.c",'s'))){
fprintf(stderr,"main:Error al crear la clave con ftok\n");
exit(1);
}
/*crear el semáforo*/
if(-1==(mutex_s=semCreate(claveMutex_s,1))){
fprintf(stderr,"main:No se puede crear el semáforo 1\n");
exit(1);
}
if(-1==(mutex_w=semCreate(claveMutex_w,1))){
fprintf(stderr,"main:No se puede crear el semáforo 2\n");
exit(1);
}
/*crear zona de memoria compartida*/
if(!crearMemoria())
fprintf(stderr,"Error al crear memoria compartida\n");
if(0!=fork()){ /*PROCESO ESCRITOR*/
if((fpl=fopen(argv[1],"r+"))==NULL){
printf("Error en la apertura del fichero %s \n",argv[1]);
exit(-1);
semClose(mutex_w);
}
rewind(fpl);
for(i=0;i<3;i++){
printf ("Dime una frase que quieras escribir:");
gets(texto);
n=strlen(texto);
semWait(mutex_w);
fwrite(texto,(n*sizeof(char)),1,fpl);
semSignal(mutex_w);
semClose(mutex_w);
exit(0);
}
fclose(fpl);
}
else{
/* PROCESO LECTOR*/
if((fpe=fopen(argv[1],"w"))==NULL){
fprintf(stderr,"Error no se puede abrir el fichero %s \n",argv[1]);
semClose(mutex_w);
semClose(mutex_s);
exit(2);
}
for(i=0;i<3;i++) {
semWait(mutex_s);
contador ++;
if(contador==1)
semWait(mutex_w);
while(!feof(fpe)){
semSignal(mutex_s);
fread((char *)c,sizeof(char),1,fpe);
semWait(mutex_s);
printf("%c",c);
}
contador --;
if(contador==0)
semSignal(mutex_w);
semSignal(mutex_s);
semClose(mutex_s);
semClose(mutex_w); /*CERRAMOS LOS FICHEROS*/
fclose(fpe);
}
/*eliminamos memoria compartida*/
if(!eliminarMemoria()){
fprintf(stderr,"Error al eliminar la memoria compartida");
exit(9);
}
}
return (0);
}