管道中的命令是否同时运行?

管道中的命令是否同时运行?

在诸如 之类的管道中command1 | command2

  • 命令是否同时运行(即具有相同的生命周期),或者
  • command2 在 command1 退出时开始运行,或者
  • 还有别的东西吗?

当我听说命令进程形成一个进程组时,我的问题出现了。如果它们的生命周期不同,那么命令进程的进程组不是就没有意义了吗?

答案1

这些过程是开始了同时,并且将同时运行,但它们不必停止同时。当以下情况发生时,shell 将认为整个管道已终止(并显示新提示):两个都进程已终止。

如果在 docommand2之前结束command1(或关闭其标准输入流),然后command1尝试写入输出,则该输出将无处可去。然后command1会收到一个SIGPIPE信号,其默认动作是 abort command1。但command1它本身可以覆盖此默认值,以便它继续运行。在这种情况下,它尝试写入输出将产生一个普通的 I/O 错误 ( EPIPE),它可以根据需要做出反应。

答案2

“|”` 又名“管道”....管道让您可以使用一个程序的输出作为另一个程序的输入”。因此,如果我们这样做:

user$ cat SHAHashing.java | grep main
    public static void main(String[] args)throws Exception

正如您所看到的,cat 首先执行显示页面内容 "THE OUTPUT" ,然后 grep 查找字符串 main 。

现在假设我输入错误CAT如下:

user$ cats SHAHashing.java | grep main
-bash: cats: command not found

没有输出“错误的命令”,grep 将执行但无事可做。因此.... cats 导致第一个命令以状态“exit 1”终止。

相关内容