我有一个随机生成 10 个字符的密码的 shell 管道:
cat /dev/urandom | base64 | head -c 10
我的问题是cat /dev/urandom | base64
一个无限的输出流,它不会自行退出。但是为什么附加head -c 10
会使整个管道退出?我假设cat
,base64
并且head
是 3 个独立的进程,如何head
让cat
进程退出?
head
读取所需数量后关闭输入文件。当管道从一侧关闭时,另一侧会出现写入错误;这导致base64
关闭,这反过来又导致cat
关闭。
base64
输出 10 个字节后,head
获得足够的输入并退出。当前者试图输出更多字节时,它会收到SIGPIPE 信号并因此退出。出于同样的原因,cat
将依次退出。
管道通过将一个进程 A 的输出连接到 B 的输入来工作。连接可以断开,当
由于这两种情况很常见,因此处理已移至 C 标准库中。