我在 Linux 平台上并使用 Perl。首先我创建了一个线程,并在这个新线程中派生了一个子进程。当新线程中的父级返回并加入主线程时,我想向创建的线程中生成的子进程发送 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";
}
}
关于如何在这种情况下成功安全地发送信号有什么建议吗?