所以我想創建一個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系統調用來說是一個相當薄的包裝(帶有將其連接到其他系統的附加邏輯)? –