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);

}