是否真的有必要在一个过程中关闭管道的未使用端

kad*_*ina 8 c unix pipe

我正在阅读UNIX中的管道,以便在两个进程之间进行进程间通信.我有以下问题

是否真的有必要关闭管道未使用的一端?例如,如果我的父进程正在将数据写入管道并且子进程正在从管道读取,是否真的有必要在父进程中关闭管道的读取端并从子进程关闭写入结束?如果我不关闭这些目的,是否有任何副作用?为什么我们需要关闭这些目的?

Dox*_*ver 12

如果你不这样做,这就是问题所在.在您的示例中,父级创建用于写入子级的管道.然后它会分叉子,但不会关闭自己的读取描述符.这意味着管道上仍有两个读取描述符.

如果孩子只有一个并关闭它(例如,通过退出),父母将获得一个SIGPIPE信号,或者如果被屏蔽,则写入管道时出错.

但是,管道上有第二个读取描述符(父级).现在,如果孩子退出,管道将保持打开状态.父级可以继续写入管道直到它填满,然后下一次写入将阻塞(或者如果没有阻塞则返回而不写入).

因此,通过不关闭父级的读取描述符,父级无法检测到子级已关闭其描述符.