在read(signalfd)之后,是否需要调用waitid()?

时间:2019-05-28 12:02:52

标签: c linux signals

对signalfd的read()的调用是否包含SIGCHLD? 还是我需要在之后使用waitid()调用?

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

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

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

1 个答案:

答案 0 :(得分:0)

您需要致电wait来从signalfd获取SIGCHLD。您从<defunct>的{​​{1}}输出中可以清楚地证明这一点。

如果您根本不关心子进程的返回码,请将ps设置为由SIGCHLD处理。不再有僵尸。