【发布时间】:2011-02-24 07:08:52
【问题描述】:
我想了解 shell 如何执行管道命令?例如猫 |更多的。我知道为了执行一个普通的命令 shell 会执行一个 fork,执行它然后子返回。但是 shell 如何在内部处理管道命令的执行?
【问题讨论】:
我想了解 shell 如何执行管道命令?例如猫 |更多的。我知道为了执行一个普通的命令 shell 会执行一个 fork,执行它然后子返回。但是 shell 如何在内部处理管道命令的执行?
【问题讨论】:
以cat | grep 为例,shell 首先分叉自己以启动cat,然后再次分叉自己以启动grep。
在两个新创建的进程中调用exec* 系列函数之一来启动两个程序之前,棘手的部分是设置管道和重定向描述符。 pipe(2) 系统调用在 shell 进程中使用,然后分叉以返回两个孩子都继承的一对描述符 - 一个读取端和一个写入端。
读取端将在第一个进程(cat)中关闭,stdout 将使用dup2(2) 系统调用重定向到写入端。同样,第二个进程(grep)中的写入端将被关闭,标准输入将再次使用dup2(2)重定向到读取端。
这样两个程序都不知道管道,因为它们只使用标准输入/输出。
【讨论】:
它使用pipe 系统调用建立一个管道,分叉两个进程而不是一个,并将管道的一端连接到第一个进程的标准输出,另一端连接到第二个进程的标准输入。
【讨论】:
dup2,但您已经从 Blagovest 的回答中找到了答案。 @Downvoter:除了太短之外,这个答案有什么问题?
相同,只是一个应用程序的标准输出与下一个标准输入相同。 http://unixwiz.net/techtips/remap-pipe-fds.html
【讨论】: