Ant*_*res 6 unix pipe unix-head
为什么不yes | head挂?
我以为系统会从中收集所有结果yes然后将其传递给它head,因为它yes是一个无限循环,系统会挂起.但是,它实际上可以停止并显示10行y.
系统如何管理停止yes时head完成收集数据?
当你说yes | headshell会安排一些东西,输出yes到一个管道,输入head来自同一个管道.当head读取10行时,它将关闭其STDIN_FILENO,从而关闭其管道末端.当yes试图写入一个封闭的管道时,它会获得一个SIGPIPE默认操作来杀死它.
测试这个的简单方法是strace:
$ strace yes | head
y
[...]
y
write(1, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 4096) = -1 EPIPE (Broken pipe)
--- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=4069, si_uid=1000} ---
+++ killed by SIGPIPE +++
Run Code Online (Sandbox Code Playgroud)