为什么这个管道终止了?

Dag*_*ang 17 unix linux bash pipe

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

cat /dev/urandom | base64 | head -c 10
Run Code Online (Sandbox Code Playgroud)

我的问题是cat /dev/urandom | base64无限输出流本身不会停止.但为什么追加head -c 10会使整个管道终止?我假设cat,base64并且head是3个独立的进程,如何head终止cat

Woo*_*ass 23

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

  • 值得一提的是,`head`得到任何输入的唯一原因是`base64`在获得一定量的输入后,即当其缓冲区已满时写入输出.如果它要读到EOF,它将永远读取,并且`head`永远不会得到任何裂缝.所以一个类似的管道,比如`cat/dev/urandom | 总和| head -c 10`的行为会有所不同,因为`sum`等待EOF. (7认同)

Hui*_*eng 11

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