預設檔案描述符的 open() 控制台

預設檔案描述符的 open() 控制台

我正在閱讀 C 語言的 shell 程式實作(來自 MIT 6.828 作業系統工程課程的 xv6 shell)。

該 shell 的函數main()以以下程式碼開始:

//Assumes three file descriptors open
while((fd = open("console", O_RDWR)) >= 0){
    if(fd >= 3){
        close(fd)
        break;
    }
}

這是 xv6 書中的一段引用,它解釋了上面的程式碼:

“shell 確保它始終打開三個文件描述符,這是控制台的預設文件描述符。”


我知道這open()將返回一個可用數量最少的文件描述符,因此這段程式碼確保打開的文件描述符不超過三個,在閱讀作者的解釋後,這一點非常明顯。

但是,我不明白的部分是:

  1. 為什麼 shell 要關閉除 0、1 和 2 之外的所有檔案描述符?畢竟可以保證 0、1 和 2 會與控制台關聯,不是嗎?為什麼 shell 應該關心關閉數量較多的檔案描述子?

  2. 我想我不太明白這裡的控制台( /dev/console ?) 文件的用途。

答案1

此程式碼片段將會打開/dev/console。產生的文件描述符是尚未開啟的編號最小的文件描述符。如果該數字最多為 2,則再次執行迴圈。如果該數字為 3 或以上,則描述符關閉且循環停止。

當循環結束時,檔案描述符 0 到 2 (標準輸入、標準輸出和標準錯誤)保證是開放的。它們要么以前打開過,並且可能連接到任何文件,要么剛剛打開過,並且連接到/dev/console.

的選擇/dev/console很奇怪。我希望/dev/tty它始終是與呼叫進程的進程組關聯的控制終端。這是少數文件之一POSIX 標準要求存在/dev/console是個系統控制台,這是發送到控制台的系統日誌訊息的位置; shell 關心這個是沒有用的。

答案2

循環很有趣。 'open()' 傳回最小數量的檔案描述子。例如,目前的fd是10,說明0,1...和9之前是開啟的。它正在關閉剛剛打開的控制台的一個額外文件描述符。

相關內容