如果我不关闭管道的读取端或写入端会发生啥?

Posted

技术标签:

【中文标题】如果我不关闭管道的读取端或写入端会发生啥?【英文标题】:What happens if I do not close read end or write end of pipe?如果我不关闭管道的读取端或写入端会发生什么? 【发布时间】:2016-02-03 08:19:38 【问题描述】:

假设我有:

command1 |命令2

忘记让 command2 进程关闭管道的写入端。

如果是这样,command1 是否会继续从 command2 读取,因为它不知道何时停止读取?

如果我忘记让 command1 进程关闭管道的读取端会怎样?

command2 进程是否会继续等待某人读取,因为它认为某个进程正在尝试从中读取?

【问题讨论】:

【参考方案1】:

我认为您的输入和输出混淆了。

command1 仅写入 command2 正在读取的管道——并且当该管道处于活动状态时(即 command2 尚未死亡或主动关闭其输入描述符),command1 将继续尝试将其输出发送到那里(或直到 command1 本身完成)。

如果 command1 完成,并且它已成功将其所有输出发送到 STDOUT(这是管道的输入端),它将退出,并且管道的该端将被关闭。如果 command2 仍在从其 STDIN(即管道的输出端)读取,它将能够获取最后的数据,并将看到文件结束条件。

另一方面,如果 command2 在 command1 完成发送之前手动关闭其输入或退出,那么下次 command1 尝试写入 STDOUT 时,将收到“broken pipe”错误。

希望这能把事情弄清楚一点。

【讨论】:

我相信问这个问题的人想知道他们是否使用了pipe() 系统调用,因为他们问如果结束没有关闭会发生什么。

以上是关于如果我不关闭管道的读取端或写入端会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何写入命名管道而不等待读取管道

当我将任何命令通过管道传输到 telnet 会话时会发生啥,为啥会话会关闭

匿名管道的 ReadFile 函数

查找 read() 返回的错误

如果我关闭设备,使用 RMS 保留的数据会发生啥情况

为啥 bash 在写入命名管道时关闭?