对signalfd的read()的调用是否包含SIGCHLD? 还是我需要在之后使用waitid()调用?
我通过调用epoll_wait()在signalfd上收到了可读事件,然后在signalfd上执行了read(),它给出了signalfd_siginfo中所需的所有信息。
我循环读取()直到返回-1和errno = EAGAIN。
但是使用shell命令ps aux时,<defunct>
仍在使用进程。
如果我使用waitid()循环,则没有问题。 为什么在read(signalfd)之后需要waitid()调用?
我在联机帮助页中看不到这种行为,也找不到源示例。
答案 0 :(得分:0)
您需要致电wait
来从signalfd获取SIGCHLD
。您从<defunct>
的{{1}}输出中可以清楚地证明这一点。
如果您根本不关心子进程的返回码,请将ps
设置为由SIGCHLD
处理。不再有僵尸。