代码之家  ›  专栏  ›  技术社区  ›  Ton van den Heuvel

read()挂起僵尸进程

  •  2
  • Ton van den Heuvel  · 技术社区  · 6 年前

    我有一个while循环,通过重定向阻塞I/O从子进程读取数据 stdout read() 在这种情况下,将返回,因为子进程关闭了从中读取的管道。

    完成的子进程不退出调用。子进程最终处于僵尸状态,因为操作系统正在等待我的代码获取它,但是我的代码在进程上被阻塞了 读()

    在挂起时,子进程本身没有任何子进程在运行,我在查找时也没有看到任何文件描述符 /proc/<child process PID>/fd

    从终端运行时,我尝试运行的子进程 读() from会自动退出,反过来,守护进程也会对其进行分叉处理并终止。

    Linux版本是4.19.2。

    这可能是什么原因呢 读()

    后续行动: How to avoid read() from hanging in the following situation?

    2 回复  |  直到 5 年前
        1
  •  3
  •   Maxim Egorushkin    6 年前

    但是,子进程没有分叉两个守护进程。。。这可能是什么原因呢 read() 在这种情况下不返回?

    分支进程在子进程终止时仍然打开文件描述符。因此 read 呼叫从不返回0。

        2
  •  1
  •   Luis Colorado    6 年前

    可能的原因(最常见的) read(2) 在具有死子级的管道上阻塞的原因是父级尚未关闭管道的写入端,因此该管道仍然有一个打开的(用于写入)描述符。从父进程中读取之前,请关闭管道的写入端。孩子死了(你说是僵尸)所以 . 别忘了 wait(2) 对于父对象中的子对象,否则您将得到一个充满僵尸的系统 :)

    请记住,您必须在代码中完成两个关闭:

    • 在父进程中,关闭管道的写入端,使父进程只剩下一个读取描述符。

    • exec(2)

    如果您想使用 pipe(2)