Comunicacion entre procesos con semaforos Hola, estoy tratando de resolver un tipico problema productor-consumidor, pero con 3 procesos, un productor y dos consumidores. Cuando el productor termina de producir se tiene que bloquear hasta que los dos condumidores hayan terminado de consumir. El problema es que no logro comunicar correctamente los procesos para que funcione. La salida por pantalla deberia ser asi:
Mes 1, termine de cocinar
Mes 1, soy consumidor 1
Mes 1, soy consumidor 2
Mes 2, termine de cocinar
Mes 2, soy consumidor 1
Mes 2, soy consumidor 2
...y asi sucesivamente, pero mi salida es:
Mes 1, termine de cocinar
Mes 1, soy consumidor 1
Mes 2, termine de cocinar
Mes 1, soy consumidor 2
Esto es lo que tengo hecho hasta el momento: #include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/stat.h>
#include <unistd.h>
#include <wait.h>
union senum
{
int val;
};
int main(void)
{
pid_t hijo1, hijo2;
int mes, j;
int sem_prod, sem_cons;
struct sembuf up = {0,1,0};
struct sembuf down = {0,-1,0};
union senum arg;
sem_prod = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
sem_cons = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
if((sem_prod == -1) || (sem_cons == -1))
{
perror("Error creando semáforos\n");
exit(1);
}
arg.val = 1;
j = semctl (sem_prod, 0, SETVAL, arg);
if(j == -1)
{
perror("Error inicializando el semáforo del productor\n");
exit(1);
}
if((hijo1 = fork()) == 0)
{
for(mes = 1; mes <= 12; mes++)
{
// Turno de producir
j = semop (sem_prod, &down, 1);
if(j == -1)
{
perror("Error bajando el semáforo del productor\n");
exit(1);
}
printf("Mes %d, termine de cocinar\n", mes);
sleep(1);
// Turno de consumir
j = semop (sem_cons, &up, 1);
if(j == -1)
{
perror("Error bajando el semáforo del consumidor\n");
exit(1);
}
}
exit(0);
}
if((hijo2 = fork()) == 0)
{
for(mes = 1; mes <= 12; mes++)
{
// Consume
j = semop (sem_cons, &down, 1);
if(j == -1)
{
perror("Error bajando el semáforo del consumidor\n");
exit(1);
}
printf("Mes %d, soy el consumidor 1\n", mes);
sleep(1);
// Produce
j = semop (sem_prod, &up, 1);
if(j == -1)
{
perror("Error bajando el semáforo del productor\n");
exit(1);
}
}
}
else
{
for(mes = 1; mes <= 12; mes++)
{
// Consumidor 2
j = semop (sem_cons, &down, 1);
if(j == -1)
{
perror("Error bajando el semáforo del consumidor\n");
exit(1);
}
printf("Mes %d, soy el consumidor 2\n", mes);
sleep(1);
// Produce
j = semop (sem_prod, &up, 1);
if(j == -1)
{
perror("Error bajando el semáforo del productor\n");
exit(1);
}
}
}
hijo1 = wait(&j);
while((hijo1 != -1) || ((hijo1 == -1) && (errno == EINTR)))
{
hijo1 = wait(&j);
}
j = semctl (sem_prod, 0, IPC_RMID);
if(j == -1)
{
perror("Error eliminando semáforo del productor\n");
}
j = semctl (sem_cons, 0, IPC_RMID);
if(j == -1)
{
perror("Error eliminando semáforo consumidor\n");
}
return 0;
} |