Devices

預設文件描述符的 open() 控制台

  • January 14, 2020

我正在閱讀 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()將返回一個可用編號最小的文件描述符,因此這段程式碼確保打開的文件描述符不超過三個,這在閱讀作者的解釋後非常明顯。

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

  1. 為什麼 shell 要關閉除 0、1 和 2 之外的所有文件描述符?畢竟保證 0、1 和 2 將與控制台相關聯,不是嗎?為什麼 shell 應該關心關閉更多數量的文件描述符?
  2. 我想我不太了解控制台( /dev/console ?)文件的用途。

此程式碼段打開/dev/console。生成的文件描述符是尚未打開的編號最小的文件描述符。如果該數字最多為 2,則再次執行循環。如果該數字為 3 或更大,則描述符關閉並且循環停止。

當循環結束時,文件描述符 0 到 2(stdin、stdout 和 stderr)保證是打開的。它們以前打開過,並且可能連接到任何文件,或者它們剛剛打開,並且連接到/dev/console.

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

引用自:https://unix.stackexchange.com/questions/72000