C:shell流水线混乱

时间:2014-02-22 02:12:10

标签: c shell pipeline

我知道pipe()函数返回两个文件描述符,当你调用fork()时,子进程继承这些文件描述符。

我也了解如何使用dup2()将文件描述符映射到标准输入和标准输出。

然而,当我把它们放在一起进行管道时,我感到很困惑。例如,当像" cat"如果给出,该过程然后分叉成父母和孩子,孩子写入父母的标准,以便下一个过程可以从标准中读取,对吗? (除非没有下一个进程,在这种情况下它只是写入标准输出?)

但是,写入标准是不是错误?如果从标准输入中读取,则下一个进程如何获得先前进程的输出? (比方说,如果我们有猫猫)。

3 个答案:

答案 0 :(得分:1)

pipe函数导致两个文件描述符:一个要写入,一个要读取。孩子写入阅读结束将是一个错误,但是孩子写入写作结束并且父母将阅读结束映射到标准输入并不是错误。

答案 1 :(得分:1)

它不是自己的标准输入,而是写入自身的标准输出,它通过管道连接到另一个进程的标准输入。例如,cat | cat看起来像这样:

stdin -> cat -> stdout  ------ stdin -> cat -> stdout
                           ^
                           |
                         pipe

答案 2 :(得分:1)

执行时

command1 | command2

shell创建一个管道。它会让孩子运行command1,并将其stdout重定向到pipe[1]。它要求另一个孩子运行command2,并将其标准输出重定向到pipe[0]。然后,当command1写入stdout时,command2会在stdin上读取它。