shell如何执行管道命令?

时间:2011-02-24 07:08:53

标签: shell unix

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

3 个答案:

答案 0 :(得分:12)

考虑到例如cat | grep,shell首先会自行启动cat,然后再次自行启动grep

在调用两个新创建的进程中的exec*函数系列之一来启动这两个程序之前,棘手的部分是设置管道并重定向描述符。在分配两个子节点继承的一对描述符(读取结束和写入结束)之前,在shell进程中使用pipe(2)系统调用。

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

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

答案 1 :(得分:4)

它使用pipe系统调用设置管道,分支两个进程而不是一个进程,并将管道的一端连接到第一个进程'stdout,另一端连接到第二个进程'stdin。

答案 2 :(得分:1)

同样,只是一个应用程序的stdout与下一个stdin相同。 http://unixwiz.net/techtips/remap-pipe-fds.html