#include "semaf.h" #include "mensaje.h" #include #include #include #include #include #include /* Variables globales */ int variable; /* La variable almacenada */ int canal; /* Fichero para comunicar los mensajes */ /* Recogida de la petición */ void recoge_peticion (struct Mensaje* mensaje) { lseek(canal,0,SEEK_SET); read(canal,mensaje,sizeof(struct Mensaje)); } /* Bucle de atención a peticiones */ void bucle_principal (void) { int salir=0; struct Mensaje mensaje; /* Bucle (casi) infinito */ while (!salir) { /* Espera por una nueva petición */ sem_P(peticion_pendiente); /* Recoge la petición del fichero de comunicaciones */ recoge_peticion(&mensaje); /* Desbloquea el fichero */ sem_V(bloquea_fichero); /* Atiende la petición */ switch (mensaje.tipo) { case LEE: printf("El valor actual es %d\n",variable); break; case ESCRIBE: printf("Valor antiguo: %d\nNuevo valor: %d\n",variable,mensaje.dato); variable=mensaje.dato; break; case TERMINA: printf("Vale, termino ya\n"); salir=1; break; default: printf("Mensaje no válido\n"); } /* Notifica al cliente que la petición se atendió */ sem_V(mensaje.peticion_servida); } } /* Programa principal */ main (int argc,char* argv[]) { /* Crea el fichero de comunicaciones */ canal = creat(CANAL,0666); if (canal==-1) { fprintf(stderr,"Error al crear el canal\n"); exit(1); } close(canal); /* Crea los semáforos */ peticion_pendiente = crea_sem(CLAVE_PP,0); bloquea_fichero = crea_sem(CLAVE_BF,1); /* Deja al proceso en segundo plano */ if (fork()==0) { canal=open(CANAL,O_RDONLY); signal(SIGTTOU,SIG_IGN); bucle_principal(); close(canal); /* destruye los semáforos */ borra_sem(peticion_pendiente); borra_sem(bloquea_fichero); } }