为什么这个管道终止了?

时间:2012-04-05 15:18:01

标签: linux bash unix pipe

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

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

我的问题是cat /dev/urandom | base64是一个无限输出流,不会自行停止。但为什么附加head -c 10会使整个管道终止?我假设catbase64head是3个独立的流程,head如何终止cat

3 个答案:

答案 0 :(得分:23)

head在读取所需金额后关闭输入文件。当管道从一侧关闭时,另一侧会出现写入错误;这会导致base64关闭,从而导致cat关闭。

答案 1 :(得分:11)

base64输出10个字节后,head获得足够的输入和退出。当前者尝试输出更多字节时,它将收到SIGPIPE signal,因此也会退出。出于同样的原因,cat将依次退出。

答案 2 :(得分:4)

管道通过将一个进程A的输出连接到B的输入来工作。连接可以被破坏,何时

  • A关闭其输出。 B将获得EOF。
  • B关闭其输入。当尝试写下一个字节时,A将收到输出不再可用的错误。

由于这两种情况如此常见,因此处理已移至C标准库中。