我想了解shell如何执行管道命令?例如猫|更多。我知道,执行一个正常的命令外壳做一个分叉,执行它,然后子返回。但是shell如何在内部处理管道命令的执行?shell如何执行管道命令?
11
A
回答
12
考虑到例如cat | grep
,shell首先分叉自己启动cat
,然后再次分叉以开始grep
。
在两个新创建的进程中调用其中一个exec*
函数来启动两个程序之前,棘手的部分是设置管道并重定向描述符。系统调用pipe(2)
在分支之前用于返回一对描述符,这两个描述符都是子继承 - 读取结束和写入结束。
读取结束将在第一个进程(cat
)中关闭,标准输出将使用系统调用dup2(2)
重定向到写入结束。类似地,第二个进程(grep
)中的写入结束将被关闭,stdin将被重新定向到使用dup2(2)
的读取结束。
这样,两个程序都不知道管道,因为他们只是使用标准输入/输出。
4
1
同样,只有一个应用程序的stdout与下一个stdin相同。 http://unixwiz.net/techtips/remap-pipe-fds.html
相关问题
- 1. 在shell(bash)中如何在管道中执行多个命令?
- 2. 管道输出命令shell命令
- 3. 执行在子shell一个管道命令,如果命令是一个变量
- 4. 命令执行shell
- 5. 执行shell命令
- 6. Shell命令执行
- 7. 在QProcess中执行shell命令。管道输入
- 8. 使用|执行shell命令(管道)使用NSTask
- 9. 什么是| (管道字符)在shell(bash)命令中执行?
- 10. 詹金斯管道:与管道多行shell命令
- 11. 从命令行执行Django Shell命令
- 12. Shell执行和管道
- 13. Perl,用管道执行bash命令
- 14. 使用findstr执行管道命令
- 15. Python执行命令与管道控制
- 16. 在android中执行管道命令
- 17. 管道执行命令只有一次
- 18. 在android中执行管道命令?
- 19. 管道命令行
- 20. 如何使用管道在Python运行shell命令xargs的2.6
- 21. 如何在后台执行shell命令
- 22. 如何在android中执行shell命令?
- 23. mruby:如何执行shell命令?
- 24. 如何在python中执行shell命令?
- 25. 如何通过Python执行shell命令
- 26. 如何在C中执行shell命令?
- 27. 如何在Opa中执行shell命令?
- 28. 如何从python执行os/shell命令
- 29. 如何使用VBA执行shell命令?
- 30. 如何在后台执行shell命令?
嗨Blagovest,我有点困惑。 grep是猫的孩子还是shell的孩子?猫如何知道它必须为grep分叉? – cppdev 2011-02-24 07:36:48
你是对的,特别是bash不会创造第二个过程作为第一个过程的孩子,但是这个原理依然成立,而且这两个过程仍然是壳的孩子。 – 2011-02-24 07:41:02