如果我不关闭管道的读端或写端会发生什么?
What happens if I do not close read end or write end of pipe?
假设我有:
命令 1 |命令 2
忘记让 command2 进程关闭管道的写入端。
如果是这样,command1 是否会继续从 command2 读取,因为它不知道何时停止读取?
如果我忘记让 command1 进程关闭管道的读取端会怎样?
command2 进程是否会继续等待某人读取,因为它认为某个进程正在尝试读取它?
我认为你的输入和输出混淆了。
command1 仅写入 command2 正在读取的管道——当该管道处于活动状态时(即 command2 尚未终止或主动关闭其“输入描述符”),command1 将继续尝试发送其“输出”那里(或直到 command1 本身完成)。
如果 command1 完成,并且它已设法将其所有输出发送到 STDOUT(这是管道的输入端),它将退出,管道的那一端将被关闭。如果 command2 仍在从它的 STDIN(这是管道的输出端)读取数据,它将能够获取最后的数据,并将看到文件结束条件。
另一方面,如果 command2 在 command1 完成发送之前手动关闭其输入或退出,下一次 command1 尝试写入 STDOUT 时,它将收到 "broken pipe" 错误。
希望这能让事情更清楚一些。
假设我有:
命令 1 |命令 2
忘记让 command2 进程关闭管道的写入端。
如果是这样,command1 是否会继续从 command2 读取,因为它不知道何时停止读取?
如果我忘记让 command1 进程关闭管道的读取端会怎样?
command2 进程是否会继续等待某人读取,因为它认为某个进程正在尝试读取它?
我认为你的输入和输出混淆了。
command1 仅写入 command2 正在读取的管道——当该管道处于活动状态时(即 command2 尚未终止或主动关闭其“输入描述符”),command1 将继续尝试发送其“输出”那里(或直到 command1 本身完成)。
如果 command1 完成,并且它已设法将其所有输出发送到 STDOUT(这是管道的输入端),它将退出,管道的那一端将被关闭。如果 command2 仍在从它的 STDIN(这是管道的输出端)读取数据,它将能够获取最后的数据,并将看到文件结束条件。
另一方面,如果 command2 在 command1 完成发送之前手动关闭其输入或退出,下一次 command1 尝试写入 STDOUT 时,它将收到 "broken pipe" 错误。
希望这能让事情更清楚一些。