Estimados:<br><br><div>Tengo un buen rollo trabajando con semáforos en el problema de productor-consumidor. Les muestro mi código.<br></div><div><br></div><div><font face="courier new,monospace">// codigo de admin.c<br></font></div>
<div><font face="courier new,monospace">pid = fork();<br>   <br>      if(pid == 0)<br>  {<br>     execl("productor", "productor", NULL);<br>  }<br><br>   wait(&status);<br>    shmctl(shmID, IPC_RMID, 0);<br>semctl(semID, 0, IPC_RMID, 0);<br>
        printf("MATE LOS SEMAFOROS\n");<br>     return 0;</font><br></div><div><font face="courier new,monospace"><br></font></div><div><font face="courier new,monospace">// codigo de productor.c</font><font face="courier new,monospace"><br>
</font></div><div><font face="courier new,monospace">struct sembuf exclMutIn = {SEM_EXCLU, -1, 0};<br>  struct sembuf exclMutOut = {SEM_EXCLU, 1, 0};<br> struct sembuf esperarVacio = {SEM_VACIO, -1, 0};<br>      struct sembuf llenar = {SEM_LLENO, 1, 0};<br>
</font></div><div><font face="courier new,monospace"><br></font></div><div><font face="courier new,monospace">for(i = 1; i <= N; ++i)</font><font face="courier new,monospace"><br></font><font face="courier new,monospace">    {</font><font face="courier new,monospace"><br>
</font><font face="courier new,monospace">    pid = fork();</font><font face="courier new,monospace"><br></font><font face="courier new,monospace">           </font><font face="courier new,monospace"><br></font><font face="courier new,monospace">       if(pid == 0)</font><font face="courier new,monospace"><br>
</font><font face="courier new,monospace">         {</font><font face="courier new,monospace"><br></font><font face="courier new,monospace">                       semID = semget(key1, 3, 0);</font><font face="courier new,monospace"><br></font><font face="courier new,monospace">                       </font><font face="courier new,monospace">semop(semID, &exclMutIn, 1);</font><font face="courier new,monospace"><br>
</font><font face="courier new,monospace">        </font><font face="courier new,monospace">                      </font></div><div><font face="courier new,monospace">        for(j = 0; j < CANTIDAD; ++j)</font><font face="courier new,monospace"><br>
</font><font face="courier new,monospace">                     { </font></div><div><font face="courier new,monospace">            semop(semID, &esperarVacio, 1); //si el buffer esta vacio no puede producir</font><font face="courier new,monospace"><br>
</font><font face="courier new,monospace">                                 </font><font face="courier new,monospace">semop(semID, &llenar, 1);</font><font face="courier new,monospace"><br></font><font face="courier new,monospace">                  </font><font face="courier new,monospace">                }</font><font face="courier new,monospace"><br>
</font><font face="courier new,monospace">        </font></div><div><font face="courier new,monospace">        semop(semID, &exclMutOut, 1);</font><font face="courier new,monospace"><br></font><font face="courier new,monospace">            </font><font face="courier new,monospace"> return 0;</font><font face="courier new,monospace"><br>
</font><font face="courier new,monospace">         }</font></div><div><font face="courier new,monospace">}</font><br>     <font face="courier new,monospace">wait(&status);</font><font face="courier new,monospace"><br></font><font face="courier new,monospace"> return 0;</font><font face="courier new,monospace"><br>
</font></div><div><font face="courier new,monospace"><br></font></div><div><font face="arial,helvetica,sans-serif">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 </font><font face="courier new,monospace">semctl(semID, 0, IPC_RMID, 0); </font><font face="arial,helvetica,sans-serif">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).</font></div>
<div><font face="arial,helvetica,sans-serif"><br></font></div><div><font face="arial,helvetica,sans-serif">Saludos.<br></font></div><div><font face="arial,helvetica,sans-serif"><br></font></div><div>-- <br></div>"Meu braço o coraçâo te arrancar<br>
Para com o meu fundo horror melhor te penetrar."<br><br>ἀποκατάστασις - restitutio in pristinum statum<br><br>