【问题标题】:How does commands-piping work in *NIX?*NIX 中的命令管道如何工作?
【发布时间】:2009-02-19 13:45:08
【问题描述】:

当我这样做时:

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

进程findgrep 是一起生成的吗?我的猜测是肯定的。如果是这样,那么它是如何工作的?:

yes | command_that_prompts_for_confirmations

如果yes 不断向标准输出发送'y',而command_that_prompts_for_confirmations 在读取其标准输入时读取'y',yes 如何知道何时终止?因为如果我单独运行yes 而不将其输出传递给其他命令,它永远不会结束。

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

【问题讨论】:

标签: linux unix pipe


【解决方案1】:

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

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

顺序是:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        第一个进程的标准输出连接到第二个进程的标准输入,以此类推。 “是”在第二个进程完成后退出,因为它不再有要写入的标准输出。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-05-13
          • 2012-06-18
          • 2012-05-10
          • 2011-06-03
          • 2011-05-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多