【问题标题】:On linux, how to wait for multiple child processes?在linux上,如何等待多个子进程?
【发布时间】:2017-02-22 06:41:02
【问题描述】:

*nix wait() 和 wait_pid() 在演示程序中工作

(1) 一个父亲叉一个孩子,等待孩子退出

(2) 并且等待函数返回。

强调的是,如果父亲不等待继续奔跑,孩子就会退出,成为“僵尸”。

但现实世界的 *nix 编程就像

(1) 我正在写一个服务器程序,

(2) 主进程分叉一些童工,

(3) 这些童工做一些工作然后退出。

那么问题来了,父亲如何处理fork并等待多个孩子?有没有一种方便的方法可以做到这一点,或者设计应该有所不同?

谢谢。

【问题讨论】:

  • 你读过man wait/man waitpid吗?
  • 父亲不需要等待它的孩子。它可以简单地有一个信号处理程序来捕获 SIGCHILD,并且处理程序可以采取必要的行动。

标签: linux process fork wait


【解决方案1】:

三种可能:

1) 使用 waitpid 定期检查死去的孩子。即一次又一次地做:

    while (waitpid(-1, NULL, WNOHANG) > 0)
        continue;

2) 信号处理程序中的清理

/* SIGCHLD handler to reap dead child processes */
static void grimReaper(int sig)
{
    int savedErrno = errno;
    while (waitpid(-1, NULL, WNOHANG) > 0)
        continue;
    errno = savedErrno;
}   
int main(void) {
    ...
    struct sigaction sa;
    memset(&sa, 0, sizeof sa);
    sigemptyset(&sa.sa_mask);
    sa.sa_handler = grimReaper;
    if (sigaction(SIGCHLD, &sa, NULL) == -1)
        ...
}       

3) 通过忽略父级中的SIGCHLD 来制造分离的子级:

signal(SIGCHLD, SIG_IGN);

【讨论】:

  • 后者在您建议的场景中很受欢迎。
猜你喜欢
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 2018-12-20
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多