perl fork()如何检查子进程是否崩溃

Cha*_*g76 2 perl fork

我有一些生成许多子进程的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)

所有相当标准的东西.现在,我想知道是否有任何子进程崩溃(无法正确终止).显然,如果没有打印每个子进程的最后一个语句,我可以认为存在问题.但是,我希望另一种方法可以完全退出父程序并关闭所有子进程,如果其中一个子进程崩溃,这些进程仍处于打开状态.这可能吗?

ike*_*ami 7

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用于未捕获异常的退出值.