檔案系統:介面

檔案描述符(file descriptor)

/ FD /

當你在劇院寄放外套時,你拿到的不是外套本身,而是一張編了號的小票。之後你把票交回去,衣帽間就替你找出外套。檔案描述符正是那張票。當你的程式開啟一個檔案時,作業系統不會把檔案、甚至檔案的位址交給你;它交給你一個小的非負整數,從此以後你每一次讀、寫、關閉,都用這個號碼來指稱那個檔案。

具體來說,檔案描述符是索引到你行程的開啟檔案表中的一個索引值。當你呼叫 open 而它成功時,作業系統在你的每行程表裡找出最低的空格、填好它讓它指向正確的開啟檔案結構、再回傳那個格子編號,比方說 3。你的呼叫 read(3, buf, 100) 意思就是「用我第 3 格所指向的那個檔案」。依照 Unix 由來已久的慣例,每個行程一開始就已經開好三個描述符:0 是標準輸入(通常是鍵盤)、1 是標準輸出(通常是螢幕)、2 是標準錯誤。這就是為什麼程式不必開啟任何東西就能印出文字:它只是寫到描述符 1。

為什麼重要:描述符是一個刻意設計成不透明的小小代幣,這讓程式保持簡單、也讓作業系統握有控制權。因為它只是索引到「每行程」表裡的一個索引,同一個號碼 3 在兩個不同行程裡代表的是完全不同的檔案,而程式也無法用一個號碼去碰它從未開啟過的檔案。一個常見的混淆是把描述符和檔案的名稱、或和位置搞混:描述符兩者都不是;它是一個每行程的代號,而它通往的位置住在共享的開啟檔案結構那邊。

fd = open("data.bin") 回傳 3。現在 read(3, buf, 64) 讀進 64 個位元組;close(3) 釋放它。在另一個執行中的程式裡,描述符 3 可能完全是一個網路通訊端——這個號碼只在單一行程內有意義。

一個小整數,索引到你行程的開啟檔案表,真正的狀態由作業系統保管。

描述符 0、1、2 依慣例是標準輸入、輸出、錯誤。描述符是每行程的索引,不是檔案名稱也不是位置;同一個號碼在不同行程裡代表不同的檔案。

又称
fdfile handle檔案描述子檔案代號