如何确保"waitpid(-1, &stat, WNOHANG)"收集所有子进程
How to make sure that `waitpid(-1, &stat, WNOHANG)` collect all children processes
摘自 Unix 网络编程 Vol1 第三版第 5.10 节 等待和等待 pid 函数
#include "unp.h"
void
sig_chld(int signo)
{
pid_t pid;
int stat;
while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) {
printf("child %d terminatedn", pid);
}
return;
}
...
// in server code
Signal(SIGCHLD, sig_chld); // used to prevent any zombies from being left around
...
..
// in client code
The client establishes five connection with the server and then immediately exit
...
参考等待:
返回值
waitpid():成功时,返回其状态的子进程 ID 已更改;如果指定了 WNOHANG 并且一个或多个子项 由 pid 指定存在,但尚未更改状态,则 0 为 返回。出错时,返回 -1。
根据上述文档,如果目前没有子进程终止,waitpid
将返回0
。如果我理解正确,这将导致函数sig_chld
中断while
语句。
问题>因此,我们如何保证此信号处理程序可以确保收集所有终止的子进程?
while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) {
printf("child %d terminatedn", pid);
如果您没有孩子要处理,您就不会在信号处理程序中。 循环是因为当您在处理程序本身中时,第二个或第三个子项可能已更改或终止发送不会排队的 SIGCHLD。 因此,循环实际上可以防止您错过那些可能死去的孩子。 当目前没有更多的子项可收获时,它将返回 0 或错误 -1 (ECHILD)。
相关文章:
- 终止 QProcess 不会终止子进程
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- 父进程和子进程之间的 POSIX 信号量
- 检测到由于操作系统内存不足而导致子进程终止
- 使用system()创建独立的子进程
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 在 Bash 脚本中处理来自子进程的信号
- Qt C++ - 如何成功将数据传递给子进程?
- C++ 窗口本地系统模拟在子进程中失败
- 将类型化数组写入子进程 stdin 无法正常工作
- 将 nodejs 脚本作为子进程执行(而不是从其他脚本执行)
- 使用信号检测子进程何时终止的最佳方法是什么?
- 等待等待失效的子进程
- 如何确保"waitpid(-1, &stat, WNOHANG)"收集所有子进程