当从管道上的read()阻塞父进程时,子进程被杀死会发生什么?我应该如何在父进程中处理这种情况?
为了澄清,父进程有两个线程。让我们说当thread2杀死孩子时,thread1正在读取管道。
read()会返回-1吗?
欢迎任何帮助。
答案 0 :(得分:2)
管道行为与流程关系无关。无论读者是父母,孩子,兄弟姐妹还是作家的其他一些遥远的关系,都适用相同的规则。或者即使读者和作者是同一个过程。
简短的回答是,从读者的角度来看,写作过程的死亡仅仅是一个EOF,而不是错误,这并不取决于写作过程是自愿调用_exit()
还是被杀死一个信号。
整个因果链如下:
过程X死亡 - >所有进程X的文件描述符都已关闭。
进程X的文件描述符之一是管道的写入端
管道写入文件描述符已关闭 - >是最后一个吗?
3A。在同一个管道上还有其他写文件描述符(例如,由fork继承并在另一个进程中仍然打开),没有任何反应。停止。
3B。此管道没有更多的写文件描述符 - >管道已经击中了EOF。
4A。管道的所有读取文件描述符都可读,唤醒在select
或poll
或read
或其他类似系统调用上阻塞的任何进程。
4b中。如果管道缓冲区中有任何剩余数据(在最后一个写文件描述符关闭之前写入),则该数据将返回给读取器。
4c中。重复4b直到管道缓冲区为空
4d上。最后,read()
返回0,表示EOF。
子进程的退出状态由wait
系列调用返回给父进程,如果你想知道你的子进程何时被信号杀死,你必须检查它。