gpt4 book ai didi

linux - 处理多个 SIGCHLD

转载 作者:行者123 更新时间:2023-11-30 16:59:39 26 4
gpt4 key购买 nike

在运行 Linux 2.6.35+ 的系统中,我的程序创建许多子进程并监视它们。如果子进程死亡,我会进行一些清理并再次生成该进程。我使用 signalfd() 来获取进程中的 SIGCHLD 信号。 signalfd 通过 libevent 异步使用。

当对非实时信号使用信号处理程序时,当信号处理程序正在针对特定信号运行时,必须阻止同一信号的进一步出现,以避免进入递归处理程序。如果此时有多个信号到达,则内核仅调用处理程序一次(当信号未被阻止时)。

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

任何人都可以澄清这种情况下 Linux 的行为吗...

最佳答案

在 Linux 上,多个子进程在您读取 SIGCHLD 之前终止与 signalfd()将被压缩为单个 SIGCHLD 。这意味着当您阅读 SIGCHLD信号,您必须在所有子进程终止后进行清理:

// 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() ,其中一个被终止的 child 没有得到处理;上面的循环修复了它。

对应文档:

关于linux - 处理多个 SIGCHLD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38031387/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com