Hola!
Estaba haciendo un ejercicio en el cual hay que sincronizar varios procesos y que estos procesos sigan sincronizandose (en este caso los procesos son unos semaforos que tienen que ir cambiando de color de forma logica osea cuando uno este en verde el otro no puede estar en verde y viceversa) hasta que se pulse ctrl-c.
El caso es que mi idea era realizar esta sincronizacion con un buzon IPC pero el problema viene que despues de la primera interaccion del bucle infinito el programa ya no vuelve a cambiar de color los semaforos, es decir, si inicialmente los semaforos estan uno a verde y otro a rojo el programa entra en el bucle y cambia el verde a rojo y el rojo a verde SOLO 1 vez (el objetivo es que este cambio se produzca continuamente).
Dejo aqui el codigo:
Muchas gracias!
Estaba haciendo un ejercicio en el cual hay que sincronizar varios procesos y que estos procesos sigan sincronizandose (en este caso los procesos son unos semaforos que tienen que ir cambiando de color de forma logica osea cuando uno este en verde el otro no puede estar en verde y viceversa) hasta que se pulse ctrl-c.
El caso es que mi idea era realizar esta sincronizacion con un buzon IPC pero el problema viene que despues de la primera interaccion del bucle infinito el programa ya no vuelve a cambiar de color los semaforos, es decir, si inicialmente los semaforos estan uno a verde y otro a rojo el programa entra en el bucle y cambia el verde a rojo y el rojo a verde SOLO 1 vez (el objetivo es que este cambio se produzca continuamente).
Dejo aqui el codigo:
Código (c) [Seleccionar]
int buzon = atoi(p_memC+334); //el buzon esta correctamente inicializado y guardado en memoria compartida
int envio, recibo;
struct tipo_mensaje
{
long tipo;
char mensaje[20];
}mensaje;
while(1){
if(*(p_memC+274) == VERDE) //aqui se comprueba el estado del semaforo horizontal, el estado lo actualiza automaticamente luz_sem
{
luz_sem(HORIZONTAL, ROJO);
strcpy(mensaje.mensaje, "HORIZ ROJO");
mensaje.tipo = HORIZONTALROJO;
if((envio = msgsnd(buzon, &mensaje, sizeof(struct tipo_mensaje)-sizeof(long), MSG_NOERROR))==-1)
{
perror("msgnd");
raise(SIGINT);
}
}else if(*(p_memC+274) == ROJO){
mensaje.tipo=VERTICALROJO;
if((recibo=msgrcv(buzon, &mensaje, sizeof(struct tipo_mensaje)-sizeof(long), mensaje.tipo, MSG_NOERROR))==-1)
{
perror("msgrcv");
raise(SIGINT);
}
luz_sem(HORIZONTAL, VERDE); //esta es una funcion que esta comprobada que funciona correctamente para cambiar el semaforo de color
}else if(*(p_memC+275) == VERDE){ //aqui se comprueba el estado del semaforo horizontal, el estado lo actualiza automaticamente luz_sem
luz_sem(VERTICAL, ROJO);
strcpy(mensaje.mensaje, "VERTICAL ROJO");
mensaje.tipo = VERTICALROJO;
if((envio = msgsnd(buzon, &mensaje, sizeof(struct tipo_mensaje)-sizeof(long), MSG_NOERROR))==-1)
{
perror("msgnd");
raise(SIGINT);
}
}else if(*(p_memC+275) == ROJO){
mensaje.tipo=HORIZONTALROJO;
if((recibo=msgrcv(buzon, &mensaje, sizeof(struct tipo_mensaje)-sizeof(long), mensaje.tipo, MSG_NOERROR))==-1)
{
perror("msgrcv");
raise(SIGINT);
}
luz_sem(VERTICAL, VERDE);
}
}
Muchas gracias!