В чем разница между этими настройками?
$SIG{CHLD} = 'IGNORE'
$SIG{CHLD} = 'DEFAULT'
$SIG{CHLD} = ''
$SIG{CHLD} = undef
В соответствии с разделом «Расширенное программирование в среде UNIX, 2-е издание» на рис. 10.1 значением SIGCHLD по умолчанию является «игнорировать».
Если «игнорировать» означает «SIG_IGN», то ни один ребенок никогда не будет зомби, и это не так.
Оттуда не становится намного яснее:
Если процесс специально устанавливает свое расположение на SIG_IGN, потомки
вызывающего процесса не будет генерировать процессы зомби. Обратите внимание, что
это отличается от его действия по умолчанию (SIG_DFL), которое из рисунка
10.1 следует игнорировать. Вместо этого, по завершении, статус этих дочерних процессов
отбрасывается.
Мне трудно ухватиться за влияние различных значений (или неопределенных не значений). До сих пор решение состояло в том, чтобы поворачивать эти варианты, пока я не получу желаемое поведение, и я бы лучше понял, как именно каждое значение определяет поведение сигнала.
Поведение: дочерний процесс вызывает «систему» или использует обратные пометки, которые создают другого дочернего процесса, и сигнал обычно будет перехвачен неправильным (родительским) обработчиком. Настройка локального обработчика может работать, но я не понимаю, какое значение является наиболее подходящим, если я хочу, чтобы сигнал от внучки ничего не делал.
Может кто-нибудь, пожалуйста, осветить меня?
UPDATE:
Основываясь на отзывах икегами, я провел определенное тестирование. Поведение, по крайней мере частично, зависит от платформы.
Рассмотрим следующий фрагмент:
$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 (). Делать что-нибудь, даже тривиально, как
local $ SIG {CHLD};
у ребенка будут подавлять эти сообщения.
На каждом другом аромате, который я пробовал, жнец никогда не видит ребенка.