一些程序可以有无限的运行时间并产生无限的输出。当在带有完成命令的管道中使用时,管道如何知道何时停止?
例如,将yes
(无限输出)与head
:
yes | head -n 5
Run Code Online (Sandbox Code Playgroud)
它只会产生 5 y
。
结束的第一个命令是停止其他进程输入/输出的命令吗?
它是如何工作的?
PSk*_*cik 24
命令与管道相连(我在这里谈论的是系统原语——显然,它们与 a 相连|
)。当管道的读端(stdin
of head
)变为close
d (== 当head
显式 ( close
) 或隐式 (exit) 关闭它时),尝试写入写端 ( stdout
of yes
) 将失败。
默认情况下,这不仅仅是常规errno
故障,而是导致写入进程接收到SIGPIPE
信号的故障。SIGPIPE 信号的默认处理程序动作是终止。
简而言之——如果你写到一个破损的管道,系统会向你发送 aSIGPIPE
并且默认情况下,aSIGPIPE
会杀死你。这就是为什么在yes
结束时head
终止(从而破坏管道)。
如果忽略SIGPIPE
父shell,那么该命令将继承这一倾向和write
一个破管只会导致errno
的错误EPIPE
。正如它所显示的那样,yes
将此错误字符串化并打印出来:
$ (trap "" SIGPIPE; yes | head -n 5)
y
y
y
y
yes: standard output: Broken pipe
yes: write error
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3981 次 |
最近记录: |