CUESTIÓN
El programa que he hecho se para a veces.
O en mi casa se para, pero en clase, no.
O en clase sí, pero en casa, no.
SOLUCIÓN
El problema suele provenir de un mal uso de pause
. Supongamos
que tenemos dos procesos, P0 y P1. P1, al arrancar, debe imprimir "Hola".
Cuando P0 le mande SIGUSR1
, P1 debe imprimir "Adiós".
Mientras no se lo mande, P1 se debe quedar
parado sin consumir CPU.
Una solución que se os puede ocurrir es:
****** ******
* P0 * * P1 *
****** ******
/* Ya tenemos registrada SIGUSR1 para
no hacer nada. */
/* Espera un poco */ printf("Hola.\n"); fflush(stdout);
kill(pid_P1, SIGUSR1); pause(); /* Nos paramos sin consumir CPU */
... printf("Adiós.\n"); fflush(stdout);
Esta solución está mal.
Si P1 es lo suficientemente rápido en
ejecutarse para llegar al pause
antes de que le manden
la señal, todo irá bien.
Sin embargo, si P0 es muy rápido y envía la
señal de modo que P1 la recibe antes de llegar al pause
,
P1 saltará a la manejadora antes.
Cuando llegue al pause
,
se quedará bloqueado porque P0,
que no sabe nada, no mandará de nuevo
la señal.
La solución pasa por usar sigsuspend
en lugar
de pause
.
También puede provocar situaciones de este tipo un interbloqueo, pero
es más raro que en esta práctica suceda por este motivo.
© 2004 Guillermo González Talaván.