В чем разница между различными значениями $ 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};
у ребенка будут подавлены эти сообщения.
На каждом другом аромате, который я попробовал, жнец никогда не видит ребенка.