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

Apokathastasis apokathastasis en gmail.com
Dom Oct 4 00:47:51 CEST 2009


2009/10/2 Apokathastasis <apokathastasis en gmail.com>

>
>  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
>
 for(i = 1; i <= N; ++i)
>
 {
>
     pid = fork();
>

>      if(pid == 0)
>
     {
>
         [...]
>
         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.
>

>
Me respondo solo. El problema era que al hacer wait(&status) espero que
termine sólo un hijo y no los N que estoy creando, entonces el padre
productor termina su ejecución y el admin que lo estaba esperando sigue con
el resto de las sentencias dentro de las cuales destruye los semáforos. La
solución fue agregar lo siguiente:

for(i = 1; i <= N; ++i)
wait(&status);

Así espero a los N hijos que terminen.
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/20091003/47a5b90f/attachment.html>


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