【问题标题】:How does pipelining work?流水线是如何工作的?
【发布时间】:2012-09-02 16:00:41
【问题描述】:

有人可以解释一下命令 ls | grep 'xxx' 内部实际发生的情况(调用的系统调用)吗?

【问题讨论】:

  • 使用strace 查找系统调用,例如strace -f bash -c 'ls | grep xxx'

标签: linux unix command kernel pipe


【解决方案1】:

首先,调用pipe(2,3p) 以创建具有读写端的管道。然后fork(2,3p) 被调用两次,每个命令调用一次。然后dup2(2,3p) 用于用管道的每一端替换每个分叉子项中的适当文件描述符。最后在每个子进程中调用exec(3) 来实际运行命令。

【讨论】:

    【解决方案2】:

    第一个命令的标准输出作为标准输入馈送到管道中的第二个命令。有几个系统调用您可能有兴趣更详细地了解正在发生的事情,特别是 fork(2)、execve(2)、pipe(2)、dup2(2)、read(2) 和 write (2)。

    实际上,shell 将 STDIN_FILENO 和 STDOUT_FILENO 分别安排为管道的读取端和写入端。当管道中的第一个进程执行 write(2) 时,该进程的标准输出被复制为管道的写入端,类似地,当第二个进程对标准输入执行 read(2) 时,它最终从管道的读取端。

    当然还有更多细节需要考虑,请查看 Richard Stevens 的《UNIX 环境中的高级编程》等书籍。

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 2020-09-28
      • 2020-05-20
      • 1970-01-01
      相关资源
      最近更新 更多