当父母被读取时被阻止时,子进程被杀死

时间:2017-03-21 20:04:35

标签: c linux embedded-linux

当从管道上的read()阻塞父进程时,子进程被杀死会发生什么?我应该如何在父进程中处理这种情况?

为了澄清,父进程有两个线程。让我们说当thread2杀死孩子时,thread1正在读取管道。

read()会返回-1吗?

欢迎任何帮助。

1 个答案:

答案 0 :(得分:2)

管道行为与流程关系无关。无论读者是父母,孩子,兄弟姐妹还是作家的其他一些遥远的关系,都适用相同的规则。或者即使读者和作者是同一个过程。

简短的回答是,从读者的角度来看,写作过程的死亡仅仅是一个EOF,而不是错误,这并不取决于写作过程是自愿调用_exit()还是被杀死一个信号。

整个因果链如下:

  1. 过程X死亡 - >所有进程X的文件描述符都已关闭。

  2. 进程X的文件描述符之一是管道的写入端

  3. 管道写入文件描述符已关闭 - >是最后一个吗?

  4. 3A。在同一个管道上还有其他写文件描述符(例如,由fork继承并在另一个进程中仍然打开),没有任何反应。停止。

    3B。此管道没有更多的写文件描述符 - >管道已经击中了EOF。

    1. 管道击中EOF - >读者注意到。
    2. 4A。管道的所有读取文件描述符都可读,唤醒在selectpollread或其他类似系统调用上阻塞的任何进程。

      4b中。如果管道缓冲区中有任何剩余数据(在最后一个写文件描述符关闭之前写入),则该数据将返回给读取器。

      4c中。重复4b直到管道缓冲区为空

      4d上。最后,read()返回0,表示EOF。

      子进程的退出状态由wait系列调用返回给父进程,如果你想知道你的子进程何时被信号杀死,你必须检查它。