2009/10/2 Apokathastasis <<a href="mailto:apokathastasis@gmail.com">apokathastasis@gmail.com</a>><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><br></blockquote>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"> Estimados:<br></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"> Tengo un buen rollo trabajando con semáforos en el problema de productor-consumidor. Les muestro mi código.<br>
</blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><br></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<font face="courier new,monospace">// codigo de admin.c<br>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><font face="courier new,monospace"></font></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<font face="courier new,monospace">//codigo de productor.c </font><font face="courier new,monospace"><br></font></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<font face="courier new,monospace"> for(i = 1; i <= N; ++i)</font><font face="courier new,monospace"><br></font></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<font face="courier new,monospace"> {</font><font face="courier new,monospace"><br></font></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><font face="courier new,monospace">     pid = fork();</font><font face="courier new,monospace"><br>
</font></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><font face="courier new,monospace"></font><font face="courier new,monospace"><br></font></blockquote>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><font face="courier new,monospace">     if(pid == 0)</font><font face="courier new,monospace"><br></font></blockquote>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><font face="courier new,monospace">     {</font><font face="courier new,monospace"><br></font></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<font face="courier new,monospace">         [...]</font><font face="courier new,monospace"><br></font></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><font face="courier new,monospace">         return 0;</font><font face="courier new,monospace"><br>
</font></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><font face="courier new,monospace">     }</font><font face="courier new,monospace"><br></font></blockquote>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><font face="courier new,monospace"> }</font><font face="courier new,monospace"><br></font></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<font face="courier new,monospace"> wait(&status);</font><font face="courier new,monospace"><br></font></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<font face="courier new,monospace"> return 0;</font><br></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><br></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
 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).<br>
</blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"> Saludos.<br></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br></blockquote><div><br></div><div>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:</div>
<div><br></div><div><font face="courier new,monospace">for(i = 1; i <= N; ++i)<br>     wait(&status);</font><br></div><div><br></div><div>Así espero a los N hijos que terminen.</div><div>Saludos.</div><div><br></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>