如果我输入:
cat /dev/urandom
那么将需要永远输出数据,但是:
cat /dev/urandom | head -c 10
输出在 10 个随机字节后结束,是否head
指示以某种方式cat
完成其输出?
答案1
当它尝试写入没有读取器的管道时,它将cat
收到一个信号(当终止时,它会自动关闭其标准输入,这也是管道读取端的唯一打开句柄)。SIGPIPE
head
如果你不知何故获取管道读取端的另一个句柄,猫不会完成,但是堵塞填满管道缓冲区后:
(仅限 Linux 的示例):
cat /dev/urandom 3</dev/stdout | head -c 10 > /tmp/junk
<staying there until you ^C>
另外,如果你得到cat
到达忽略信号SIGPIPE
,生成SIGPIPE
信号的写入将简单地失败,将设置errno
为EPIPE
=Broken pipe
^1:
{ trap '' PIPE; cat /dev/urandom; } | head -c 10 >/tmp/junk
cat: write error: Broken pipe
这head
过程与这一切无关。事实并非如此信号,指示或根本关心cat
;它只是读取它需要的任何内容,然后退出,将其留给操作系统来处理其余的所有事情。
^1后一种行为(非常烦人)是 python 脚本的默认行为:
python -c 'while 1: print("hello")' | head -n2
hello
hello
Traceback (most recent call last):
File "<string>", line 1, in <module>
IOError: [Errno 32] Broken pipe