回答
與您的問題(|
)相同,管道(特別是匿名管道)允許您在兩個程序(或更多,在一個鏈中)之間直接傳遞數據,而無需在磁盤上創建任何中間文件。不必處理創建和刪除這樣的臨時文件是很方便的,並且可以更快,因爲不需要將文件寫入磁盤,因爲磁盤I/O(相對)較慢。
使用不同文件描述符(尤其stdout
和stderr
,它們分別爲1和2)允許您處理從程序stdout
或stderr
流至一些文件。僅使用stderr
的程序確實需要選擇文件描述符的能力,否則只需重定向到stdout(使用>
或1>
)就足夠了。
使用stderr
和管的一個人爲的例子是這樣的:
# ./some-program 2> errors
# cat errors | wc -l
這將從some-program
打印出stderr
到文件errors
,和cat errors
然後管道輸出到wc -l
,其是errors
中的行數。 請注意,您幾乎不想使用wc
這種方式,並且可以只做wc -l errors
。這只是爲了說明。
文件描述符優於普通匿名管道重定向的優點,看到任何。我的結論是,管道總是更好? – user1155119 2012-01-18 14:26:23
從一個進程到另一個進程的管道輸入涉及文件描述符;第一個進程的標準輸出(fd = 1)連接到流水線中下一個進程的標準輸入(fd = 0)。
的替代使用的管道是臨時文件:
ls > tmp.1
wc < tmp.1
rm -f tmp.1
管的優點在此是多方面的,但包括:
- 沒有臨時文件以使左左右。
- 在中斷等情況下,無需代碼即可嘗試清理臨時文件。
- 這些進程可以並行工作(特別有利於多核機器)。
- 無需發明文件名。
- 較少打字。
將文件描述符0,1,2變爲標準輸入,輸出和錯誤的決定非常有價值。數字到流的映射是任意的,但只要每個人都同意,就完全有效。
- 1. bash的文件描述符重定向
- 2. 輸出文件描述符重定向
- 3. 重定向文件描述符
- 4. 碳多重管道管和問題文件描述符
- 5. 重定向文件描述符3三通
- 6. 管道沒有創建特定的管道描述符
- 7. 通過文件描述符 - Execve(typecast)
- 8. 重定向stdin從linux中的文件描述符c
- 9. 重定向到一個奇怪的文件描述符否
- 10. 錯誤的文件描述符 - 雙I/O重定向
- 11. 重定向的文件描述符被卡住
- 12. C管道:錯誤的文件描述符
- 13. 命名管道,選擇錯誤的文件描述符C++
- 14. 關閉管道得到錯誤的文件描述符
- 15. 錯誤的文件描述符,同時重定向輸出的命令文件
- 16. EclipseLink(JPA 2)缺少描述符異常
- 17. 管理指向套接字文件描述符的指針
- 18. 將輸入重定向到文件描述符?
- 19. 重新打開一個封閉的管道讀取文件描述符?
- 20. popen後重復的文件描述符
- 21. 文件描述符的重複
- 22. 變量中帶有文件描述符或文件名的Bash重定向
- 23. select()如何等待常規文件描述符(非套接字)?
- 24. 確定可讀文件描述符是否是管道的讀取端
- 25. 程序卡住了,管道文件描述符何時打開?
- 26. 在C中關閉管道,dup2,文件描述符?
- 27. 瞭解UNIX管道和文件描述符
- 28. 管道()帶叉()遞歸:文件描述符處理
- 29. 如何直接將Gnuplot輸出指向文件描述符(例如管道)?
- 30. 描述多通道渲染的附件
我不明白你在這裏比較什麼。請舉個具體的例子。 – 2012-01-18 00:54:22
能否詳細說明一下?在這種形式下,這不是一個真正有效的問題。 – 2012-01-18 00:54:31
這似乎是對OP上一個問題的繼續:http:// stackoverflow。com/questions/8903612/can-we-have-more-file-descriptors-other-the-usual-stdin-stdout-stderr-0-1 – shellter 2012-01-18 00:57:47