私は Linux プラットフォームで Perl を使用しています。まず、スレッドを作成し、この新しいスレッドで子プロセスを fork しました。新しいスレッドの親が戻ってきてメインスレッドに参加したら、作成したスレッドで生成された子プロセスに TERM シグナルを送信したいのですが、シグナルハンドラが機能せず、子プロセスがゾンビ化してしまいます。これが私のコードです:
use strict;
use warnings;
use Thread 'async';
use POSIX;
my $thrd = async {
my $pid = fork();
if ($pid == 0) {
$SIG{TERM} = \&child_exit;
`echo $$ > 1`;
for (1..5) {
print "in child process: cycle $_\n";
sleep 2;
}
exit(0);
}
else {
$SIG{CHLD} = \&reaper;
}
};
$thrd->detach();
sleep 4;
my $cpid = `cat 1`;
kill "TERM", $cpid;
while (1) {}
sub child_exit {
print "child $$ exits!\n";
exit(0);
}
sub reaper {
my $pid;
while (($pid = waitpid(-1, &WNOHANG)) > 0) {
print "reaping child process $pid\n";
}
}
この状況で信号を正常かつ安全に送信する方法について何か提案はありますか?