使用 fd 3 安全嗎?

使用 fd 3 安全嗎?

有幾個問題使用它來執行多個輸出管道之類的事情,而不使用進程替換:

為此僅使用固定的 fd 編號是否安全?是否有可能某個程式已經按照描述使用它這裡我們會涵蓋一些重要的內容或讀取一些不相關的內容嗎?

答案1

是否有可能某個程式已經在使用它

不會。

通常,當程式或腳本啟動時,僅開啟標準描述符(0/標準輸入、1/標準輸出和2/標準錯誤)。 (它們可能指的是終端、設備、文件,甚至是網路套接字;但它們應該是打開的。我們不是「關閉」一個,而是將不需要的描述符從/到重定向/dev/null,本質上是「無處」/「無」 .)

程式透過系統呼叫使用描述符,就像open使用空閒描述符一樣。也就是說,它們不要求內核打開檔案或套接字到特定的描述符,內核選擇描述符。因此,程式使用附加描述符的唯一情況是當程式啟動時預計它已經開啟。有一些像這樣的罕見實用程式守護程序 - 除了標準描述符之外,它們還期望如果描述符 3 在它們啟動時打開,則它會連接到它們的管理服務(或類似的服務)。

如果一個程式決定使用硬編碼描述符(唯一的原因是它分叉並執行另一個程序期望該描述符要打開;正如我所說,這種情況非常罕見),當程式用它的用途替換它時,已經打開的描述符會被關閉。 (順便說一句,當程式表明他們想要使用特定的描述符時,核心會執行關閉操作,例如dup2()在 POSIXy 系統中;進程不需要關心。)

Shell 腳本(Bash 和 sh)使用固定的描述符編號,因此腳本可能使用特定的描述符來執行某些輸入/輸出重定向。但是,當發生這種情況時,先前的重定向將被忽略,並且不會產生任何效果,因為腳本假定描述符已關閉。 (如果描述符是打開的,並且腳本將該描述符用於某些內部內容,則當腳本重定向它時,原始描述符將首先由內核關閉,並且出於前一段中提到的原因。對於任何類型要發生資料外洩,腳本必須專門測試如果描述符已經打開,並且避免重定向它。

另請注意,Fortran I/O 單元或通道與描述符無關,即使兩者都使用數字進行標識。因此,即使 Fortran 程式使用單元 10,也不表示它使用描述符 10。

為此僅使用固定的 fd 編號是否安全?

是的。 POSIX 規定一個程式至少可以開啟 20 個描述符,因此 3 到 19 之間的任何固定數量都應該可以正常運作。

關鍵點是很好地記錄它,最好是在腳本開頭的簡短註釋中(對於腳本),或者在用法(-h--help命令行選項)和手冊頁(對於程式)中。

對於腳本,您可以假設如果發生衝突(如果發生衝突,則會出現「腳本根本不起作用,因為程式啟動後管道就會關閉」的情況,如上所述),使用者可以更改固定描述符數量以更好地滿足他們的需求。因此,作為劇本作者,你的任務就是提前規劃,並讓後續的人更容易規劃。 (描述您的意圖和整體設計的清晰註釋就足夠了;沒有必要將描述符編號設置為變量,或描述腳本所做的每個小動作。)

對於程式來說,使其運行時可配置是一個好主意。例如,您可以讓您的程式/守護程式使用描述符 3(如果開啟)用於具有圖形使用者介面的特殊控制協定;但是,使用某些命令列選項(如“-c 5”),使用命名描述符(或者,與-c /dev/name-c named-pipe-c :socketpath 使用指定的檔案、命名管道或本地域套接字)。這樣用戶就可以輕鬆解決與腳本的任何衝突。

相關內容