我编写了一个Perl程序,该程序在子进程中分叉并调用后台程序,并且有一个无休止的while循环,它在父进程中执行一些操作。现在,当子进程中的后台程序终止时,应该保留while循环:
$pid = fork();
if ( !$pid ) {
exec( "program args" );
} else {
while ( 1 ) {
# do something
# needs help: if program terminated, break
}
}
答案 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()是阻塞的,所以在程序退出之前它不会返回,但我可能错了。