В чем разница между различными значениями $ SIG {CHLD}?

В чем разница между этими настройками?

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

Согласно «Расширенное программирование в среде UNIX, 2-е издание», рисунок 10.1, значением по умолчанию SIGCHLD является «игнорировать».

Если «игнорировать» означает «SIG_IGN», то ни один ребенок никогда не будет зомби, и это не так.

Оттуда не становится намного яснее:

Если процесс специально устанавливает свое расположение на SIG_IGN, дочерние элементы вызывающего процесса не будут генерировать процессы-зомби. Обратите внимание, что это отличается от действия по умолчанию (SIG_DFL), которое на рисунке 10.1 следует игнорировать. Вместо этого по завершении состояние этих дочерних процессов отбрасывается.

Я с трудом пытаюсь понять, как влияют различные значения (или неопределенные значения). До сих пор решение состояло в том, чтобы поворачивать эти варианты, пока я не получу желаемое поведение, и я бы лучше понял, как именно каждое значение определяет поведение сигнала.

Поведение: дочерний процесс вызывает «system» или использует обратные пометки, которые создают другого дочернего процесса, и сигнал обычно будет перехвачен неправильным (родительским) обработчиком. Настройка локального обработчика может работать, но я не понимаю, какое значение является наиболее подходящим, если я хочу, чтобы сигнал от внучки ничего не делал.

Может ли кто-нибудь, пожалуйста, осветить меня?

ОБНОВИТЬ: Основываясь на отзывах икегами, я провел определенное тестирование. Поведение, по крайней мере частично, зависит от платформы.

Рассмотрим следующий фрагмент:

$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 в Solaris 10 будет отображать сообщения «SIGNAL CHLD» для PID вызова system (). Делать что угодно, даже тривиально

местный $ SIG {CHLD};

у ребенка будут подавлены эти сообщения.

На каждом другом аромате, который я попробовал, жнец никогда не видит ребенка.

Ответы на вопрос(4)

Ваш ответ на вопрос