#include "rshmem.h" #include int main(int argc,char *argv[ ]){ /* DECLARACIONES DE VARIABLES */ int *acaracter; /* contador de caracter antiguo */ int *ncaracter; /* variable compartida contador de caracter actual */ char *caracter; /* variable compartida por los dos procesos almacen del caracter leido del fichero */ int mutex; /* semaforo */ key_t claveMutex; /* clave semaforo mutex */ /* control del paso de argumentos */ if(argc!=3){ fprintf(stderr, "Main: Error en el paso de argumentos."); exit(3); } /* obtener una clave cualquiera para el recurso ipc */ if((key_t)-1 == (claveMutex=ftok("con1.c" , 's'))){ fprintf( stderr, "Main: Error al crear la clave con ftok()\n"); exit(1); } /* crear el semaforo */ if(-1==(mutex=semCreate(claveMutex, 1))){ 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"); ncaracter = (int*) memoria ; /* contador de caracteres leidos */ acaracter = (int*) ncaracter + sizeof(int); /* variable auxiliar */ caracter = (char*) acaracter + sizeof(int); /* variable s.c. */ *ncaracter=0; *acaracter=0; *caracter=NULL; if(0!=fork()){ /* PROCESO PADRE */ int i; /* contador */ char linea[85]; /* variable donde se guardan las lineas leidas */ FILE *fpt=NULL; /* puntero al fichero entrada*/ /* apertura del fichero entrada*/ if((fpt=fopen(argv[1], "r"))==NULL){ fprintf(stderr,"No se puede abrir %s\n",argv[1]); semClose(mutex); exit(2); } /* Tratamiento de LECTURA del fichero */ while( NULL!=fgets(linea, 81, fpt)){ if (strlen(linea)<80) break; linea[strlen(linea)]=' '; for(i=0; i<=80; ){ semWait(mutex); if (*acaracter == *ncaracter) { *caracter=linea[i]; (*ncaracter)++; i++; } semSignal(mutex); } } (*ncaracter)=-1; semClose(mutex); fclose(fpt); exit(0); }else{ /* PROCESO HIJO */ char caract; /* variable auxiliar */ enum {INICIO, TRANSITO} estado = INICIO ; enum {SI, NO} leido = NO ; FILE *fptsali; /* puntero 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 */ if (-1 == (mutex = semOpen(claveMutex))) fprintf(stderr, "No tengo el cualificador de mutex\n"); /* Tratamiento de SUBSTITUCION */ do{ semWait(mutex); if(*acaracter!=(*ncaracter)){ caract =(*caracter); leido =SI; *acaracter = *acaracter + 1; } semSignal(mutex); if(leido==SI){ switch(caract){ case '*': if(estado==INICIO){ estado=TRANSITO; }else{ fprintf(stdout, "^"); fflush(stdout); fprintf(fptsali,"^"); estado=INICIO; } 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 */ leido=NO; }/* fin del if(leido) */ }while (*ncaracter!=-1); semClose(mutex); close(fptsali); /* eliminar memoria compartida */ if(!eliminarMemoria()) fprintf(stderr, "Error al eliminar memoria compartida\n"); exit(0); }/* fin else proceso hijo */ }/* fin main() */