【问题标题】:How does shell execute piped commands?shell如何执行管道命令?
【发布时间】:2011-02-24 07:08:52
【问题描述】:

我想了解 shell 如何执行管道命令?例如猫 |更多的。我知道为了执行一个普通的命令 shell 会执行一个 fork,执行它然后子返回。但是 shell 如何在内部处理管道命令的执行?

【问题讨论】:

    标签: shell unix


    【解决方案1】:

    cat | grep 为例,shell 首先分叉自己以启动cat,然后再次分叉自己以启动grep

    在两个新创建的进程中调用exec* 系列函数之一来启动两个程序之前,棘手的部分是设置管道和重定向描述符。 pipe(2) 系统调用在 shell 进程中使用,然后分叉以返回两个孩子都继承的一对描述符 - 一个读取端和一个写入端。

    读取端将在第一个进程(cat)中关闭,stdout 将使用dup2(2) 系统调用重定向到写入端。同样,第二个进程(grep)中的写入端将被关闭,标准输入将再次使用dup2(2)重定向到读取端。

    这样两个程序都不知道管道,因为它们只使用标准输入/输出。

    【讨论】:

    • 嗨 Blagovest,我有点困惑。 grep 是 cat 的孩子还是 shell 的孩子? cat 怎么知道它必须为 grep 分叉?
    • 你是对的,特别是 bash 不会将第二个进程创建为第一个进程的子进程,但原则仍然成立,两个进程仍然是 shell 的子进程。
    【解决方案2】:

    它使用pipe 系统调用建立一个管道,分叉两个进程而不是一个,并将管道的一端连接到第一个进程的标准输出,另一端连接到第二个进程的标准输入。

    【讨论】:

    • 你能解释一下如何将一个进程的标准输出与另一个进程的标准输入连接起来吗?
    • @cppdev:使用dup2,但您已经从 Blagovest 的回答中找到了答案。 @Downvoter:除了太短之外,这个答案有什么问题?
    【解决方案3】:

    相同,只是一个应用程序的标准输出与下一个标准输入相同。 http://unixwiz.net/techtips/remap-pipe-fds.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-12
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      相关资源
      最近更新 更多