%20%E6%8E%A7%E5%88%B6%E5%8F%B0.png)
我正在閱讀 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()
將返回一個可用數量最少的文件描述符,因此這段程式碼確保打開的文件描述符不超過三個,在閱讀作者的解釋後,這一點非常明顯。
但是,我不明白的部分是:
為什麼 shell 要關閉除 0、1 和 2 之外的所有檔案描述符?畢竟可以保證 0、1 和 2 會與控制台關聯,不是嗎?為什麼 shell 應該關心關閉數量較多的檔案描述子?
我想我不太明白這裡的控制台( /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之前是開啟的。它正在關閉剛剛打開的控制台的一個額外文件描述符。