首页 > 解决方案 > 读取(signalfd)之后,是否需要调用waitid()?

问题描述

对 signalfd 的 read() 调用是否会消耗 SIGCHLD?或者我需要在之后使用 waitid() 调用吗?

我通过调用 epoll_wait() 在 signalfd 上接收到可读事件,然后我在 signalfd 上执行 read(),它提供了 signalfd_siginfo 中所需的所有信息。我在 read() 上循环,直到返回 -1 和 errno=EAGAIN。但是使用 shell 命令 ps aux,进程仍然在这里<defunct>

如果我使用 waitid() 循环,我没有问题。为什么我需要在 read(signalfd) 之后调用 waitid() ?

我在联机帮助页中看不到这种行为,也找不到源示例。

标签: clinuxsignals

解决方案


您需要调用从 signalfdwait获取。SIGCHLD您的<defunct>输出清楚地证明了这一点ps

如果您从不关心子进程返回码,请设置SIGCHLD为由SIG_IGN. 没有更多的僵尸。


推荐阅读