命令管道如何在* NIX中工作?

时间:2009-02-19 13:45:09

标签: linux unix pipe

当我这样做时:

find . -name "pattern" | grep "another-pattern"

流程findgrep是否一起催生了?我的猜测是肯定的。如果是这样,那么这是如何工作的?:

yes | command_that_prompts_for_confirmations

如果yes持续向stdout发送'y'并且command_that_prompts_for_confirmations在读取其stdin时读取'y',yes如何知道何时终止?因为如果我单独运行yes而没有将其输出传递给其他命令,它就永远不会结束。

但是如果管道命令不能同时产生所有进程,那么yes如何知道要输出多少个?这对我来说是22。有人能解释一下这个管道在* NIX中是如何工作的吗?

4 个答案:

答案 0 :(得分:11)

the wikipedia page“本身,yes命令输出'y'或任何指定为参数的内容,后跟换行符,直到被用户停止或以其他方式终止;当用管道输入时命令,它将一直持续到管道中断(即程序完成执行)。“

yes不知道何时终止。但是,在某些时候输出“y”到stdout将导致错误,因为另一个进程已经完成,这将导致管道损坏,并且是将终止。

序列是:

  1. 其他程序终止
  2. 操作系统关闭管道
  3. 是尝试输出字符
  4. 错误发生(破管)
  5. 是终止

答案 1 :(得分:5)

是的,(一般来说)管道中的所有流程都是一起产生的。关于yes和类似的情况,信号被传递回管道以指示它不再接受输入。具体来说:SIGPIPE,详情herehere。有关* nix流水线的更多有趣信息可在wikipedia上找到。

如果您中断了一个不期望它的命令,您可以看到SIGPIPE正在运行,因为您收到Broken Pipe错误。我似乎无法找到一个在我的Ubuntu设置上做到这一点的例子。

答案 2 :(得分:4)

其他答案已涵盖终止。另一个方面是yes只会输出有限数量的y - 管道中有一个缓冲区,一旦填满,yes将阻止其写入请求。因此,yes不会消耗无限的CPU时间。

答案 3 :(得分:3)

第一个进程的stdout连接到第二个进程的stdin,依此类推。当第二个进程完成时,“yes”退出,因为它不再有要写入的标准输出。