shell如何执行管道命令?

cpp*_*dev 11 unix shell

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

Bla*_*iev 12

例如cat | grep,shell首先要求自己启动cat,然后再次自行启动grep.

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

读取端将在第一个进程(cat)中关闭,stdout将使用dup2(2)系统调用重定向到写入端.类似地,第二个进程(grep)中的写入结束将被关闭,并且stdin将再次使用重定向到读取结束dup2(2).

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