これらの設定の違いは何ですか?
$SIG{CHLD} = 'IGNORE'
$SIG{CHLD} = 'DEFAULT'
$SIG{CHLD} = ''
$SIG{CHLD} = undef
「UNIX環境での高度なプログラミング 第2版」によると、図10.1のSIGCHLDのデフォルト値は「無視」です。
「無視」が「SIG_IGN」を意味する場合、子供はゾンビになることはなく、そうではありません。
そこからはあまり明確になりません。
プロセスがその性質を明確に SIG_IGN に設定した場合、呼び出しプロセスの子はゾンビ プロセスを生成しません。これは、デフォルトのアクション (SIG_DFL) とは異なることに注意してください。図 10.1 では無視されます。代わりに、終了時に、これらの子プロセスのステータスは破棄されます。
さまざまな値(または未定義の非値)の影響が何であるかを理解するのに苦労しています。これまでの解決策は、目的の動作が得られるまでこれらの選択肢を繰り返し使用することでしたが、各値が信号の動作をどのように定義するかを正確に理解したいと考えています。
動作: 子プロセスが「システム」を呼び出しているか、別の子を作成するバックティックを使用しており、シグナルは通常、間違った (親) ハンドラーによってキャッチされます。ローカル ハンドラーを設定することはできますが、孫からのシグナルで何もしないようにする場合、どの値が最も適切かわかりません。
誰か私を照らしてくれませんか?
更新: ikegami のフィードバックに基づいて、特定のテストを行いました。この動作は、少なくとも部分的にはプラットフォーム固有です。
次のフラグメントを検討してください。
$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;
Solaris 10 上の Perl 5.8.6 は、system() 呼び出しの PID に対して「SIGNAL CHLD」メッセージを表示します。些細なことでも何でもする
ローカル $SIG{CHLD};
子でそれらのメッセージを抑制します。
私が試した他のすべてのフレーバーでは、死神は子供を見ることはありません.