Quelle est la différence entre les divers $SIG{CHLD} valeurs?

Quelle est la différence entre ces paramètres?

$SIG{CHLD} = 'IGNORE'  
$SIG{CHLD} = 'DEFAULT'  
$SIG{CHLD} = ''  
$SIG{CHLD} = undef

Selon "Advanced Programming in the UNIX Environment, 2e édition", la figure 10.1 la valeur par défaut de SIGCHLD est "ignorer".

Si "ignorer" signifiait "SIG_IGN", alors aucun enfant ne pourrait jamais être un zombie, et ce n'est pas le cas.

Il n'est pas beaucoup plus clair à partir de là:

Si le processus définit sa disposition à SIG_IGN, les enfants
le processus appelant ne générera pas de zombie processus. Notez que
ceci est différent de son action par défaut (SIG_DFL), qui, à partir de la Figure
10.1 est d'être ignoré. Au lieu de cela, en cas de résiliation, le statut de ces processus enfants
est mis au rebut.

Je vais avoir un moment difficile groking quel est l'impact de différentes valeurs (ou indéfini à non-valeur). Jusqu'à présent, la solution a été de tourner à travers ces choix jusqu'à ce que je obtenir le comportement désiré, et je préfère comprendre exactement comment chaque valeur définit le comportement du signal.

Le comportement: un processus enfant appelle "système" ou à l'aide de backticks qui créer un autre enfant, et le signal normalement être pris par le mal (parent) gestionnaire. Définition d'un gestionnaire local peut fonctionner, mais je ne comprends pas de quelle valeur est la plus appropriée si je veux le signal de la grand-enfant de ne rien faire.

Quelqu'un pourrait-il svp m'éclairer?

Mise à JOUR:
Basé sur ikegami commentaires, j'ai fait quelques tests spécifiques. Le comportement est, au moins partiellement, la plate-forme.

Considérer le fragment suivant:

$SIG{CHLD} = sub {
    while( ( my $child = waitpid( -1, &WNOHANG ) ) > 0 ) {
        print "SIGNAL CHLD $child\n";
    }
};

my $pid = fork();

if( ! $pid ) {
    system( 'echo Grandchild PID = $$' );
    sleep 2;
    exit;
}

print "Child PID = $pid\n";
sleep 5;

Perl 5.8.6 sur Solaris 10 affiche "SIGNAL CHLD" messages pour le PID de l'appel system (). Faire quoi que ce soit, même d'aussi insignifiant qu'

local $SIG{CHLD};

dans l'enfant va supprimer ces messages.

Sur tous les autres saveur, j'ai essayé, la faucheuse ne voit jamais l'enfant.

local $SIG{CHLD}; est le même que local $SIG{CHLD} = undef;

OriginalL'auteur Trueblood | 2011-12-05