C 在while循环中使用wait()而不是waitpid()

C 在while循环中使用wait()而不是waitpid(),c,wait,zombie-process,waitpid,C,Wait,Zombie Process,Waitpid,我知道wait()和waitpid()之间的区别之一是waitpid有一个WNOHANG选项,它告诉waitpid如果有尚未终止的正在运行的子项,就不要阻塞。例如: while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) printf("Child %d terminated\n", pid); 如果使用wait()而不是waitpid(),则如果有尚未终止的正在运行的子级,则无法防止wait()阻塞。但是,我想知道wait()

我知道wait()和waitpid()之间的区别之一是waitpid有一个WNOHANG选项,它告诉waitpid如果有尚未终止的正在运行的子项,就不要阻塞。例如:

while (  (pid = waitpid(-1, &stat, WNOHANG)) > 0)
    printf("Child %d terminated\n", pid);

如果使用wait()而不是waitpid(),则如果有尚未终止的正在运行的子级,则无法防止wait()阻塞。但是,我想知道wait()在这里是否工作正常,即使它可能会阻塞。

我们不能在循环中调用wait,因为如果有尚未终止的正在运行的子级,则无法阻止wait阻塞。

我们不能在循环中调用wait,因为如果存在尚未终止的正在运行的子级,则无法阻止wait阻塞。

只要有正在终止的处理,该循环将只循环。否则,如果没有子进程终止,它将只导致对
waitpid
的一次调用,该调用返回
0
,并中断循环。如果我将此代码放入信号处理程序(捕获SIGCHLD信号),该处理程序会因为有子进程终止而执行,将等待()工作正常?如果您收到
SIGCHLD
信号,您知道子进程发生了什么,因此可以调用
wait
,而不会阻塞它。如果有很多子进程,有些已经终止,但有些还没有终止,我可以使用这样的wait()处理程序吗?永远不要使用
wait()
;这是一个过时的API,有几个问题。如果在代码中有两个地方创建子项,
wait()
可能会获取错误的pid(例如在
system()
的旧实现中,这是一个错误)。几乎没有任何理由不为您真正感兴趣的进程
waitpid()
,并保持干净。只要有进程被终止,该循环就会循环。否则,如果没有子进程终止,它将只导致对
waitpid
的一次调用,该调用返回
0
,并中断循环。如果我将此代码放入信号处理程序(捕获SIGCHLD信号),该处理程序会因为有子进程终止而执行,将等待()工作正常?如果您收到
SIGCHLD
信号,您知道子进程发生了什么,因此可以调用
wait
,而不会阻塞它。如果有很多子进程,有些已经终止,但有些还没有终止,我可以使用这样的wait()处理程序吗?永远不要使用
wait()
;这是一个过时的API,有几个问题。如果在代码中有两个地方创建子项,
wait()
可能会获取错误的pid(例如在
system()
的旧实现中,这是一个错误)。对于您真正感兴趣的流程,几乎没有任何理由不
waitpid()
,并保持干净。