我正在使用fork
来产生一些并行运行多个任务的subprocess。 在我的情况下,只是简单地等待一个循环中的所有subprocess是不够的,因为如果我的列表中的第一个进程是最后一个进程完成,那么我的waitpid
调用会阻塞,直到该进程完成。
每当进程结束,我都希望我的waitpid
呼叫唤醒。 原因是我马上要检查完成的subprocess的退出代码,以确定进程是否成功,所以我可以取消任何仍在运行的subprocess。 在我的情况下,如果任何subprocess返回一个非零的退出代码,那么让它们继续(可能持续几个小时!)是没有意义的,因为这会表示错误,甚至一个错误都会使整个承诺毫无意义。
(编辑:我知道这不是如何waitpid
实际工作,但我正在寻找这样的事情。)
现在,我可以通过使用循环来调用waitpid
与WNOHANG
标志,然后继续检查我的subprocess与单独的waitpid
调用之间的hibernate间隔,但这种解决scheme似乎是一个黑客。 有没有人有一个更优雅的解决scheme?
您可以使用等待功能,等待子进程终止并返回已故进程的PID。
你可以捕获SIGCHLD,像这样:
$SIG{CHLD} = sub { my $child; while ( ( $child = waitpid( -1, WNOHANG ) ) > 0 ) { warn("Reaped $child, exited with $?"); } };