#include "rshmem.h" int main(int argc, char *argv[]){ /*DECLARACIONES DE VARIABLES*/ key_t claveMutex; /* clave semaforo mutex*/ key_t bclaveMutex; /* clave semaforo bmutex*/ char *caracter; /*variable compartida por los dos procesos almacen del caracter leido del fichero*/ int mutex; /* semaforo*/ int bmutex; /* semaforo*/ /* control del paso de argumentos*/ if(argc!=3){ fprintf(stderr,"Main: Error en el paso de argumentos\n"); exit(3); } /* obtener una clave cualquiera para el caracter ipc */ if((key_t)-1 == (claveMutex=ftok("con2.c" , 's'))){ fprintf( stderr, "Main: Error al crear la clave con ftok()\n"); exit(1); } /* crear el semaforo mutex */ if(-1==(mutex=semCreate(claveMutex, 1))){ fprintf(stderr, "Main: No se puede crear el semaforo\n"); exit(1); } /* obtener una clave cualquiera para el caracter ipc */ if((key_t)-1 == (bclaveMutex=ftok("con2.c" , 'b'))){ fprintf( stderr, "Main: Error al crear la clave con ftok()\n"); exit(1); } /* crear el semaforo bmutex */ if(-1==(bmutex=semCreate(bclaveMutex, 0))){ fprintf(stderr, "Main: No se puede crear el semaforo\n"); exit(1); } /* crear zona de memoria compartida */ if(!crearMemoria()) fprintf(stderr, "Error al crear memoria compartida \n"); caracter = (char *)memoria ; /*variable s.c.*/ *caracter=NULL; if(0!=fork()){ /*PROCESO PADRE*/ int i=0; /*variable contador*/ char caract; /*variable auxiliar*/ FILE *fpt=NULL; /*punterp al fichero entrada*/ /* apertura fichero entrada*/ if((fpt=fopen(argv[1], "r"))==NULL){ fprintf(stderr,"No se puede abrir el %s\n",argv[1]); semClose(mutex); exit(2); } i = 0; /* Tratamiento LECTURA del fichero*/ while (EOF != (caract = fgetc(fpt))) { semWait(mutex); *caracter = caract ; semSignal(bmutex); if (i == 79) { semWait(mutex); *caracter = ' '; semSignal(bmutex); i = 0; } else i++; } semWait(mutex); (*caracter)=EOF; semSignal(bmutex); semClose(mutex); semClose(bmutex); fclose(fpt); exit(0); }else{ /* PROCESO HIJO*/ char caract; enum {INICIO, TRANSITO} estado = INICIO ; enum {SI, NO} leido = NO ; FILE *fptsali=NULL; /*puntero al fichero salida*/ /* apertura del fichero salida*/ if((fptsali=fopen(argv[2],"w"))==NULL){ fprintf(stderr , "No se puede abrir %s\n",argv[2]); exit(2); } /* apertura del semaforo mutex*/ if (-1 == (mutex = semOpen(claveMutex))) fprintf(stderr, "No tengo el cualificador de mutex\n"); /*apertura del semaforo bmutex*/ if (-1 == (bmutex = semOpen(bclaveMutex))) fprintf(stderr, "No tengo el cualificador de mutex\n"); /*Tratamiento de SUBSTITUCION*/ do{ semWait(bmutex); caract =(*caracter); semSignal(mutex); switch(caract){ case '*': if(estado==INICIO){ estado=TRANSITO; }else{ fprintf(stdout, "^"); fflush(stdout); fprintf(fptsali,"^"); estado=INICIO; } break ; case EOF: break ; default: if(estado==INICIO) { fprintf(stdout,"%c",caract); fflush(stdout); fprintf(fptsali,"%c",caract); } else{ fprintf(stdout,"*%c",caract); fflush(stdout); fprintf(fptsali,"*%c",caract); estado=INICIO; } }/*fin del switch*/ } while (caract!=EOF); semClose(mutex); semClose(bmutex); fclose(fptsali); /* eliminar memoria compartida */ if(!eliminarMemoria()) fprintf(stderr, "Error al eliminar memoria compartida\n"); exit(0); }/*fin else proceso hijo */ }/*fin main()*/