我想了解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