(fork/waitpid)等待子进程的列表,但每次子进程完成时都会中断等待



我使用fork生成许多并行运行多个任务的子进程。在我的情况下,仅仅等待循环中的所有子进程是不够的,因为如果列表中的第一个进程是最后一个完成的进程,那么我的waitpid调用将阻塞,直到该进程完成。

我希望每次进程结束时,我的waitpid调用都能唤醒。原因是我想立即检查完成的子进程的退出代码,以确定该进程是否成功,这样我就可以取消任何仍在运行的子进程。在我的情况下,如果任何子进程返回非零退出代码,那么让它们继续下去(可能持续数小时!)是没有意义的,因为这将指示错误,即使是一个错误也会使整个过程变得毫无意义。

(编辑:我知道waitpid实际上不是这样工作的,但我正在寻找类似的东西。)

现在,我可以通过使用循环用WNOHANG标志调用waitpid,然后在各个waitpid调用之间不断检查我的子进程的睡眠间隔来实现这一点,但这个解决方案看起来像是一个破解。有人有更优雅的解决方案吗?

您可以使用等待函数,它等待子进程终止并返回已故进程的pid。

您可以捕获SIGCHLD,类似于以下内容:

$SIG{CHLD} = sub {
    my $child;
    while ( ( $child = waitpid( -1, WNOHANG ) ) > 0 ) {
        warn("Reaped $child, exited with $?");
    }
};

最新更新