我有一些生成许多子进程的Perl代码.基本代码如下:
my $forked = 0;
my $err = 0;
my $Processes_To_Use_After_Calc=10;
print "Parent ($$) has started\n";
for my $ispawn (1 .. $Processes_To_Use_After_Calc){
my $child_pid = fork();
die "Cannot fork: $!" if !defined $child_pid; # system overload
if(defined $child_pid && $child_pid > 0) {
## Parent
$forked++;
} elsif(defined $child_pid){
#
# Here some calculations are performed
#
print "Child $$ has finished (number $ispawn) \n";
}
}
for(1..$forked) {
my $child_pid = wait();
}
Run Code Online (Sandbox Code Playgroud)
所有相当标准的东西.现在,我想知道是否有任何子进程崩溃(无法正确终止).显然,如果没有打印每个子进程的最后一个语句,我可以认为存在问题.但是,我希望另一种方法可以完全退出父程序并关闭所有子进程,如果其中一个子进程崩溃,这些进程仍处于打开状态.这可能吗?
wait 套 $?
wait(2)在您的系统上表现得像:它等待子进程终止并返回已故进程的pid,或者-1如果没有子进程.状态返回$?和${^CHILD_ERROR_NATIVE}.
所以,
my $child_pid = wait();
if ( $? == -1 ) { die "wait failed: $!\n"; }
elsif ( $? & 0x7F ) { warn "Child $child_pid killed by signal ".( $? & 0x7F )."\n"); }
elsif ( $? >> 8 ) { warn "Child $child_pid exited with error ".( $? >> 8 )."\n"); }
else { print "Child $child_pid exited successfully\n"; }
Run Code Online (Sandbox Code Playgroud)
如果程序崩溃真的,你会得到Child killed by signal 11,这是SIGSEGV.
如果它抛出未被捕获的异常,你可能会得到Child exited with error XXX.确切的值会因程序而异,可能毫无意义.默认情况下,Perl $! || ($? >> 8) || 255用于未捕获异常的退出值.