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