c - 是否真的有必要关闭进程中未使用的管道端

标签 c unix pipe

我正在阅读有关 UNIX 中用于两个进程之间进程间通信的管道的信息。我有以下问题

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

最佳答案

如果不这样做,问题就来了。在您的示例中,父级创建了一个用于写入子级的管道。然后它会派生子进程但不会关闭自己的读取描述符。这意味着管道上仍然有两个读取描述符。

如果子进程只有一个并且它关闭了它(例如,通过退出),父进程会收到一个 SIGPIPE 信号,或者,如果该信号被屏蔽,则会在写入管道时出错。

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

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

关于c - 是否真的有必要关闭进程中未使用的管道端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24766013/

相关文章:

shell - 如何通过管道读取zsh?

c - 将系统命令的输出通过管道传输到文件

c - 关于/proc/xx/map 和 vm_area_struct

c - 如何让 Check 生成核心转储?

c - |之间的区别b 和 a + b 当 a 或 b 为零时

c - 为什么这两个函数的结果不同?

python - 如何在树莓派或任何其他 unix 系统上编写多命令 cronjob

c - UNIX:退出时等待进程子进程?

linux - 在 cp 命令中使用通配符 [xyz]

c - 执行 ("/bin/sh", 0, 0);在管道中