首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理多个SIGCHLD

处理多个SIGCHLD
EN

Stack Overflow用户
提问于 2011-12-06 10:22:12
回答 2查看 14.7K关注 0票数 22

在运行Linux 2.6.35+的系统中,我的程序创建许多子进程并监视它们。如果一个子进程死了,我会做一些清理工作,然后再进行一次。我使用signalfd()在我的过程中获取SIGCHLD信号。signalfd是使用libevent异步使用的。

当对非实时信号使用信号处理程序时,当信号处理程序对特定信号运行时,必须阻止同一信号的进一步出现,以避免进入递归处理程序。如果此时到达多个信号,那么内核只调用处理程序一次(当信号解除阻塞时)。

在使用signalfd()时,这也是相同的行为吗?由于基于signalfd的处理不存在与正常信号处理程序异步执行相关的典型问题,我认为内核可以对所有进一步发生的SIGCHLD进行队列处理吗?

有人能澄清Linux在这种情况下的行为吗..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-06 10:37:00

在Linux上,在使用SIGCHLD阅读signalfd()之前终止的多个子程序将被压缩成一个SIGCHLD。这意味着当您读取SIGCHLD信号时,您必须清理所有已终止的孩子:

代码语言:javascript
复制
// Do this after you've read() a SIGCHLD from the signalfd file descriptor:
while (1) {
    int status;
    pid_t pid = waitpid(-1, &status, WNOHANG);
    if (pid <= 0) {
        break;
    }
    // something happened with child 'pid', do something about it...
    // Details are in 'status', see waitpid() manpage
}

我应该注意的是,事实上,当两个子处理同时结束时,我已经看到了这种信号压缩。如果我只执行了一个waitpid(),终止的子程序之一就不会被处理;上面的循环修复了它。

相应文件:

  • http://man7.org/linux/man-pages/man7/signal.7.html“相反,如果一个标准信号的多个实例在该信号当前被阻塞时被传递,那么只有一个实例是queued"
  • http://man7.org/linux/man-pages/man3/sigwait.3p.html”如果在调用σ等待()之前,单个信号号有多个挂起的实例,则实现--定义在成功返回时是否还有该信号号码的任何剩余挂起信号。“

票数 24
EN

Stack Overflow用户

发布于 2013-10-23 14:45:37

实际上,无麻烦的方式将是waitfd功能,它允许您为轮询()/epoll()添加一个特定的pid。不幸的是,它在几年前被Linux提出的时候没有被接受。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8398298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档