[C con Clase] Duda con manejo de semáforos y procesos.

Apokathastasis apokathastasis en gmail.com
Vie Oct 2 17:38:29 CEST 2009


Estimados:

Tengo un buen rollo trabajando con semáforos en el problema de
productor-consumidor. Les muestro mi código.

// codigo de admin.c
pid = fork();

if(pid == 0)
{
   execl("productor", "productor", NULL);
}

wait(&status);
shmctl(shmID, IPC_RMID, 0);
semctl(semID, 0, IPC_RMID, 0);
printf("MATE LOS SEMAFOROS\n");
return 0;

// codigo de productor.c
struct sembuf exclMutIn = {SEM_EXCLU, -1, 0};
struct sembuf exclMutOut = {SEM_EXCLU, 1, 0};
struct sembuf esperarVacio = {SEM_VACIO, -1, 0};
struct sembuf llenar = {SEM_LLENO, 1, 0};

for(i = 1; i <= N; ++i)
{
    pid = fork();

    if(pid == 0)
    {
        semID = semget(key1, 3, 0);
        semop(semID, &exclMutIn, 1);

        for(j = 0; j < CANTIDAD; ++j)
        {
            semop(semID, &esperarVacio, 1); //si el buffer esta vacio no
puede producir
            semop(semID, &llenar, 1);
        }

        semop(semID, &exclMutOut, 1);
        return 0;
    }
}
wait(&status);
return 0;

El problema que tengo es el siguiente: El semaforo SEM_VACIO se inicia con
un valor de 8. Si los valores de N y CANTIDAD son 9 y 1 respectivamente. En
algún momento alguno de los hijos que genera el productor debiera quedar
bloqueado. Pero lo que sucede es que en cierto instante se ejecuta la
linea semctl(semID,
0, IPC_RMID, 0); del admin matándome los semaforos. El problema que tengo es
cómo hacer que el admin espere a todos los procesos que terminen. (sus hijos
y los hijos del productor).

Saludos.

-- 
"Meu braço o coraçâo te arrancar
Para com o meu fundo horror melhor te penetrar."

ἀποκατάστασις - restitutio in pristinum statum
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20091002/22c293c9/attachment.html>


Más información sobre la lista de distribución Cconclase