Linux Pipe命令是否需要一个过程来执行?

时间:2018-07-24 23:15:35

标签: linux bash shell linux-kernel

ls -la | sort | less

在上面的命令中,有多少个Linux进程运行?

是3个(一个ls -la,一个sort,一个less)吗?

还是5(一个用于ls -la,一个用于sort,一个用于less,每个管道一个)?

|命令是否需要单独的进程才能运行?

2 个答案:

答案 0 :(得分:0)

shell中的管道通常是对pipe(2)的调用,对dup2(2)的两个调用以及这两个命令的调用。管道本身不需要单独的进程,因为内核负责将数据从一个进程引导到另一个进程。

答案 1 :(得分:0)

3个进程。父进程或您从(您的命令行)调用此命令的进程,对通过管道传输的两个进程分别调用pipe(2),因此ls -la | sort | less需要调用pipe(2)两次以创建两个管道:一个用于将ls管道输送到sort,另一个用于将sort管道输送到less。然后Bash为每个进程分叉一次(在这种情况下为3次)。在子代运行命令之前,他们会覆盖stdin和/或stdout。该命令的示例流程为:

  1. Bash创建2个管道,一个从lssort,另一个从sortless
  2. 重击本身分了3次
  3. 子级1(ls)将其stdout fd设置为写入管道A
  4. 子级2(sort)将其stdin fd设置为从管道A读取
  5. 子级2(sort)将其stdout fd设置为写入管道B
  6. 子级3(less)将其stdin fd设置为从管道B读取
  7. 每个孩子都运行其命令

管道用于引导子进程的stdin和/或stdout,但管道本身不是进程。