【发布时间】:2018-11-30 10:51:23
【问题描述】:
我有一个 while 循环,它通过将子进程的 stdout 重定向到父进程来使用阻塞 I/O 从子进程读取数据。通常,一旦子进程退出,在这种情况下会返回阻塞read(),因为从中读取的管道已被子进程关闭。
现在我遇到了read() 调用不会为完成的子进程退出的情况。子进程最终处于僵尸状态,因为操作系统正在等待我的代码获取它,但我的代码却阻塞了 read() 调用。
子进程本身在挂起时没有任何子进程正在运行,并且在查看/proc/<child process PID>/fd 时我没有看到任何文件描述符。然而,子进程确实派生了两个守护进程,其目的似乎是监视子进程(子进程是我无法控制的专有应用程序,因此很难确定)。
当从终端运行时,我尝试 read() 的子进程自动退出,而它派生的守护进程也随之终止。
Linux 版本为 4.19.2。
read() 在这种情况下没有返回的原因是什么?
跟进:How to avoid read() from hanging in the following situation?
【问题讨论】:
-
为什么不使用信号处理程序杀死子进程时关闭管道?
-
@BumsikKim 这里没有进程被杀死,子进程应该简单地退出。我将编辑问题以澄清这一点。
-
为
SIGCHLD设置一个信号处理程序,并通过调用wait()或waitpid()在其中收割孩子。 -
@alk,感谢您的指点,我会调查一下。不过,我不明白为什么
read()不会在子进程退出后简单地返回。 -
“在孩子退出后”它没有(完全)。正如你提到的,它仍然处于僵尸状态。
标签: c linux pipe fork zombie-process