所以我想创建一个Perl程序,分叉工人,并等待它完成。在我的真实使用案例中,我需要分派许多工作人员并等待他们,所以我想我会尝试一个工作人员的测试用例。我在这里担心的是,当我在终端中运行此程序时,发送^C
不会终止父进程,即使信号处理程序看起来应该收获子进程并导致父进程正常退出。我试图使用waitpid
来保持父母活着,以便它可以接收信号并将它们传递给孩子,但父母过程似乎完全忽略^C
。Perl转发信号SIGINT分叉子进程
use strict;
use warnings FATAL => 'all';
use POSIX ":sys_wait_h";
my $cpid;
sub reap_children_and_exit {
defined $cpid and kill 'HUP', $cpid;
exit 0;
}
$SIG{INT} = \&reap_children_and_exit;
my $child_text = <<'EOF';
perl -e 'while (1) { printf "%s\n", rand() }'
EOF
$cpid = fork;
if ($cpid == 0) {
exec($child_text)
}
waitpid($cpid, WNOHANG);
'waitpid'的文档页面(http://perldoc.perl.org/functions/waitpid.html)有点稀疏。这个函数是否意味着对于Linux系统调用来说是一个相当薄的包装(带有将其连接到其他系统的附加逻辑)? –