Cosechado con un Manejador para CHLD

Manejo Simple

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.

Problemas

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

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.

Cosechado e IGNORE

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.

Ejercicio 3.4.3   Estudie y comente las respuestas al nodo wait versus close on a pipe en PerlMonks



Subsecciones
Casiano Rodríguez León
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19