如果我不关闭管道的读取端或写入端会发生啥?
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()
系统调用,因为他们问如果结束没有关闭会发生什么。以上是关于如果我不关闭管道的读取端或写入端会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章