La forma habitual de cosechar los hijos de un proceso es instalar un manejador para la señal CHLD :
$SIG{CHLD} = sub { wait() }:
Este código funciona la mayor parte del tiempo.
Sin embargo cuando un proceso es parado (ha recibido una señal STOP )
también se produce una señal CHLD
. En tal caso el padre obtiene
la señal pero la señal no significa la finalización del
proceso hijo. El padre ejecutará el wait
y podría atascasrse si la señal de continuar no es enviada al hijo.
Otro problema surge del hecho de que Unix
sólo entrega una señal CHLD
si varios subprocesos
terminan al mismo tiempo. En este caso se produce la ''fuga'' de un zombi.
Una solución a estos problemas es la siguiente:
use POSIX qw(WNOHANG); local $SIG{CHLD} = sub { while (my $kid = waitpid(-1, WNOHANG)) > 0) {} };
Si la señal CHLD
fué consecuencia de una parada, el uso
del modificador WNOHANG garantiza que no hay atasco.
El bucle asegura que todos los zombies serán cosechados.
En un buen número de plataformas Unix las señales
CHLD mantienen una conducta especial
con respecto al valor de IGNORE .
Poner $SIG{CHLD} = 'IGNORE'
tiene el efecto
de no crear un zombie. En tales plataformas la llamada
a wait retorna -1
.