我想了解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. 在QProcess中執行shell命令。管道輸入
- 7. 詹金斯管道:與管道多行shell命令
- 8. 從命令行執行Django Shell命令
- 9. 使用findstr執行管道命令
- 10. 在android中執行管道命令
- 11. 管道命令行
- 12. 如何從python執行os/shell命令
- 13. mruby:如何執行shell命令?
- 14. 如何在C中執行shell命令?
- 15. 如何通過Python執行shell命令
- 16. 如何使用VBA執行shell命令?
- 17. shell是否在子shell中管道之前運行命令?
- 18. PHP shell執行命令
- 19. 從ruby執行shell命令
- 20. Nodejs child_process執行shell命令
- 21. RealBasic:執行shell命令
- 22. 執行shell命令(c)
- 23. Groovy執行shell命令
- 24. python:os.system不執行shell命令
- 25. 在VBA執行Shell命令
- 26. 從Java執行shell命令
- 27. 由shell管道命令迷茫
- 28. 如何從shell或windows內聯命令執行java jshell命令
- 29. Gulp-Shell不執行任何命令
- 30. GDB - 管道輸出的內部命令到shell命令
嗨Blagovest,我有點困惑。 grep是貓的孩子還是shell的孩子?貓如何知道它必須爲grep分叉? – cppdev 2011-02-24 07:36:48
你是對的,特別是bash不會創造第二個過程作爲第一個過程的孩子,但是這個原理依然成立,而且這兩個過程仍然是殼的孩子。 – 2011-02-24 07:41:02