Devices
預設文件描述符的 open() 控制台
我正在閱讀 C 中的 shell 程序實現(麻省理工學院 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 ?)文件的用途。
此程式碼段打開
/dev/console
。生成的文件描述符是尚未打開的編號最小的文件描述符。如果該數字最多為 2,則再次執行循環。如果該數字為 3 或更大,則描述符關閉並且循環停止。當循環結束時,文件描述符 0 到 2(stdin、stdout 和 stderr)保證是打開的。它們以前打開過,並且可能連接到任何文件,或者它們剛剛打開,並且連接到
/dev/console
.的選擇
/dev/console
很奇怪。我本來期望/dev/tty
的,它始終是與呼叫程序的程序組關聯的控制終端。這是POSIX 標準要求存在的少數文件之一。/dev/console
是系統控制台,這是發送到控制台的 syslog 消息;shell 關心這個沒有用。