这是为什么管终止?(Why is this pipe terminated?)

2019-06-23 10:27发布

这是随机生成10个字符的密码一个管道命令:

cat /dev/urandom | base64 | head -c 10

我的问题是cat /dev/urandom | base64 cat /dev/urandom | base64是一个无限的输出流,这将无法自动停止。 但是,为什么追加head -c 10使得整个管终止? 我认为catbase64head被3个分离过程,怎么能head终止cat

Answer 1:

base64输出10个字节, head得到足够的输入和退出。 当前者试图输出更多的字节,它会收到SIGPIPE信号 ,并因此退出too.For同样的原因, cat将依次退出。



Answer 2:

head读取所需量后关闭输入文件。 当一个管从一侧封闭,另一侧得到写入错误; 这导致base64关闭,这反过来又导致cat关闭。



Answer 3:

管道的工作方式是连接一个进程A的输出到B的输入端的连接可以被打破,当

  • A关闭其输出。 B会取得EOF。
  • B关闭它的输入。 当它试图写入下一个字节一个会得到一个错误的输出不再可用。

因为这两种情况是如此普遍,处理已移动到C标准库。



文章来源: Why is this pipe terminated?