如何在后台进程在Perl中终止时收到通知?

时间:2010-02-03 11:01:55

标签: perl fork

我编写了一个Perl程序,该程序在子进程中分叉并调用后台程序,并且有一个无休止的while循环,它在父进程中执行一些操作。现在,当子进程中的后台程序终止时,应该保留while循环:

$pid = fork();
if ( !$pid ) {
    exec( "program args" );
} else {
    while ( 1 ) {
        # do something

        # needs help: if program terminated, break
    }
}

4 个答案:

答案 0 :(得分:3)

好吧,fork为您的父进程提供子进程的PID(您可以在代码中尽职地检索)。这正是父母可以照顾孩子的。

要在循环结束时离开循环,您可以使用kill 0 $pid检查子项是否仍然存在。见perldoc -f kill

答案 1 :(得分:2)

您需要有一个信号处理程序来处理子进程退出时发送父进程的CHLD信号。 (有关perl中信号处理的更多详细信息,请参阅perldoc perlipc。)

你可以在else循环中执行类似下面的操作来获得子进程。

...
} else {
    $SIG{CHLD} = \&reaper
}

# hash to store exit status of child processes
our %child;    
sub reaper {
    my $x;
    while (($x = waitpid(-1,WNOHANG)) >0) {
        $child{$x} = $? >> 8;
    }
}

... } else { $SIG{CHLD} = \&reaper } # hash to store exit status of child processes our %child; sub reaper { my $x; while (($x = waitpid(-1,WNOHANG)) >0) { $child{$x} = $? >> 8; } }

或者您可以将设置为不担心子进程变成僵尸。

答案 2 :(得分:0)

根据您的申请,您可以不时检查孩子是否结束,然后父母可以完成。您可以使用posix waitpid()和WNOHANG进行无阻塞等待,或发出信号以检查您的孩子是否仍在运行,或者您可以使用管道(检查它何时关闭)。我个人会使用waitpid()。 perlipc中的例子有一个非常好的解释。

答案 3 :(得分:-1)

我猜,exec()是阻塞的,所以在程序退出之前它不会返回,但我可能错了。

相关问题