哪些程序使用高於 2 的文件描述符?
預設情況下打開標准文件描述符 <= 2。程序可以在 2 之後寫入或讀取文件描述符,而無需使用
open
系統呼叫來獲取這樣的描述符。然後,該程序可以在其手冊中宣傳它正在使用哪些文件描述符以及如何使用。為了利用這一點,POSIX shell 可以打開一個文件並將該文件分配給具有exec
內置的描述符。之後,shell 將啟動將使用該描述符和文件的程序。這樣做的一個原因是如果程序想要有多個輸出或輸入文件,並且不想將它們指定為命令行參數。如果只有一個文件,您可以只重定向一個標准文件描述符。
我從未見過一個普遍可用的程序會在其手冊中宣傳這樣的事情。這在實踐中會發生嗎?有人聽說過這樣的事情嗎?
是的,我確實想留在 POSIX 世界中——所以沒有僅限 bash 的內置外掛。我只是想知道有沒有這樣的程序,而不是內置的shell。
<(...)
當您使用or使用程序替換時>(...)
,bash 將在任意高文件描述符上打開一個到另一個程序的管道(我認為它曾經從 10 開始計數,但現在它從 63 開始向下計數)並/dev/fd/N
按照命令傳遞名稱第一個程序的行。這不是 POSIX,但其他 shell 也支持它(這是 ksh88 功能)。不過,這並不完全是您正在執行的程序的一個功能,它只是看到
/dev/fd/N
並嘗試像普通文件一樣打開它。
- Autoconf 手冊中提到了一些歷史記錄:
一些古老的系統保留了一些文件描述符。
/dev/tty
按照慣例,當您登錄到第八版 (1985) 到第十版 Unix (1989) 時,會打開文件描述符 3 。文件描述符 4 在 Stardent/Kubota Titan(大約 1990 年)上有一個特殊用途,儘管我們現在不記得它是什麼了。這兩個系統都已過時,因此現在可以安全地將文件描述符 3 和 4 視為任何其他文件描述符。
- 此外,當我對此進行Google搜尋時,我發現了一個名為的程序,該程序
runit
使用文件描述符 4 和 5 用於與日誌輪換相關的某些目的。- 並從
svlogd
手冊頁中引用:如果
svlogd
被告知處理最近的日誌文件,(…)。svlogd
還保存處理器寫入文件描述符 5 的任何輸出,並在下一次日誌文件輪換執行處理器時使該輸出在文件描述符 4 上可用。