2012-01-18 36 views
-2

與常規管道重定向相比,文件描述符有哪些優缺點(例如ls | wc)?通過常規管道重定向的文件描述符的優缺點?

爲什麼喜歡文件描述符stdin 0,stdout 1,stderr 2等? 有什麼想法?

+0

我不明白你在這裏比較什麼。請舉個具體的例子。 – 2012-01-18 00:54:22

+0

能否詳細說明一下?在這種形式下,這不是一個真正有效的問題。 – 2012-01-18 00:54:31

+2

這似乎是對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

回答

2

與您的問題(|)相同,管道(特別是匿名管道)允許您在兩個程序(或更多,在一個鏈中)之間直接傳遞數據,而無需在磁盤上創建任何中間文件。不必處理創建和刪除這樣的臨時文件是很方便的,並且可以更快,因爲不需要將文件寫入磁盤,因爲磁盤I/O(相對)較慢。

使用不同文件描述符(尤其stdoutstderr,它們分別爲1和2)允許您處理從程序stdoutstderr流至一些文件。僅使用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。這只是爲了說明。

+0

文件描述符優於普通匿名管道重定向的優點,看到任何。我的結論是,管道總是更好? – user1155119 2012-01-18 14:26:23

2

從一個進程到另一個進程的管道輸入涉及文件描述符;第一個進程的標準輸出(fd = 1)連接到流水線中下一個進程的標準輸入(fd = 0)。

的替代使用的管道是臨時文件:

ls > tmp.1 
wc < tmp.1 
rm -f tmp.1 

管的優點在此是多方面的,但包括:

  • 沒有臨時文件以使左左右。
  • 在中斷等情況下,無需代碼即可嘗試清理臨時文件。
  • 這些進程可以並行工作(特別有利於多核機器)。
  • 無需發明文件名。
  • 較少打字。

將文件描述符0,1,2變爲標準輸入,輸出和錯誤的決定非常有價值。數字到流的映射是任意的,但只要每個人都同意,就完全有效。

相關問題