为什么"是|头"不挂?

Ant*_*res 6 unix pipe unix-head

为什么不yes | head挂?

我以为系统会从中收集所有结果yes然后将其传递给它head,因为它yes是一个无限循环,系统会挂起.但是,它实际上可以停止并显示10行y.

系统如何管理停止yeshead完成收集数据?

cni*_*tar 5

当你说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)