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.