Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Comunicacion entre procesos con semaforos

Estas en el tema de Comunicacion entre procesos con semaforos en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 04/12/2009, 09:03
 
Fecha de Ingreso: diciembre-2009
Mensajes: 1
Antigüedad: 14 años, 5 meses
Puntos: 0
Mensaje 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;
}
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:13.