我正在使用fork
生成许多并行运行多个任务的子进程。在我的情况下,仅仅等待循环中的所有子进程是不够的,因为如果我的列表中的第一个进程是最后一个完成,那么我的waitpid
调用将阻塞,直到该进程完成。
我希望每次进程完成时我的waitpid
调用都会被唤醒。原因是我立即想要检查已完成的子进程的退出代码以确定进程是否成功,以便我可以取消仍在运行的任何子进程。在我的情况下,没有必要让它们继续(可能持续数小时!)如果任何子进程返回非零退出代码,因为这将指示错误,甚至单个错误将使整个任务毫无意义。
(编辑:我知道waitpid
实际上并不是这样,但我正在寻找类似的东西。)
现在,我可以通过使用循环来调用带有waitpid
标志的WNOHANG
来执行此操作,然后继续检查我的子进程与个别{{1}之间的睡眠间隔调用,但这个解决方案似乎是一个黑客。有没有人有更优雅的解决方案?
答案 0 :(得分:3)
您可以使用wait函数,它等待子进程终止并返回已故进程的pid。
答案 1 :(得分:1)
您可以捕获SIGCHLD,如下所示:
$SIG{CHLD} = sub {
my $child;
while ( ( $child = waitpid( -1, WNOHANG ) ) > 0 ) {
warn("Reaped $child, exited with $?");
}
};