Linux/Unix 中是否存在「非標準」流?

Linux/Unix 中是否存在「非標準」流?

Linux中所謂的「標準流」是stdin、stdout和stderr。它們必須被稱為“標準”是有原因的。是否存在非標準流?內核是否從根本上區別對待那些非標準流?

答案1

在這種情況下,「流」是進程中開啟的檔案。 (「流」一詞可能有其他與本文無關的含義。)

這三個標準流是在程式啟動時應該已經打開的流。檔案描述符 0 稱為標準輸入,因為程式應該在此處讀取使用者輸入或其預設資料輸入。檔案描述符 1 稱為標準輸出,因為程式應該在其中寫入其正常資料輸出。檔案描述符 2 稱為標準錯誤,因為程式應該在其中寫入錯誤訊息。

其他文件描述符編號不是標準的,因為它們沒有這樣的預先分配的角色。它們最終將被用於程式想要的任何用途。因此,可以將程式打開的任何文件稱為“非標準流”,但這會很奇怪且令人困惑:“打開stdin、stdout 或stderr 之外的文件”實際上不需要名稱,而“非標準流」聽起來像是某些特殊類型的文件或透過非標準方法開啟的文件,情況並非如此。

文件描述符 0-2 的常規角色是由標準庫和某些程序授予的。例如,控制台登入程式和終端機模擬器啟動 shell(或其他程式),並在這些檔案描述符上開啟終端。 C 標準函式庫FILE*為這三個標準描述符建立物件(C 稱之為流)。核心中沒有特殊處理。

答案2

核心以相同的方式處理所有檔案描述符。進程使用檔案描述符 0 作為輸入 (stdin)、檔案描述符 1 作為輸出 (stdout)、並在檔案描述符 2 (stderr) 上列印錯誤只是一種約定。

當你的終端啟動時,它會建立一個偽tty 並啟動一個shell,其中輸入/輸出分配給檔案描述符0、1 和2。輸入和/或輸出。

相關內容