跳至內容

檔案描述子

出自Taiwan Tongues 台語維基
這是此頁批准,以及是最近的修訂。

檔案描述子(File descriptor)是電腦科學中的一个術語,是一个用於表述指向檔案的參照的抽象化概念。

概欲

檔案描述子佇形式上是一个非負整數。實際上,伊是一个索引值,指向核心為每一个行程所維護的該行程拍開檔案的記錄表。當程式拍開一个現有檔案或者建立一个新檔案的時陣,核心向行程傳回一个檔案描述子。佇咧程式設計內底,一寡牽涉著底層的程式來編寫往往會圍踅檔案描述子展開。但是檔案咧講這一概念往往干焦適用佇咧 UNIX、Linux 這款的作業系統。

彼每一个 Unix 行程(除了可能較捷駐程式)應該攏有三个標準的 POSIX 檔案描述子,對應三个標準流:

優點

檔案描述子的優點主要有兩个:

  • 是因為檔案描述子的 I / O 操作相容 POSIX 標準。
  • 佇咧 UNIX、Linux 的系統呼叫中,大量的系統呼叫攏是依賴伊的檔案來講。

比如講,下跤的程式碼就示範矣如何是因為檔案來講子來讀當前 kha-tá-lok-guh 後的一个指定檔案,並共檔 àn-nāi 容列印到主控台。

此外,佇咧 Linux 系列的作業系統上,因為 Linux 的設計思想就是共一切裝置攏視作檔案。所以,檔案描述子的存在提供了程式操作裝置的統一方法。

缺點

檔案描述子的概念存在兩大缺點:

  • 在非 UNIX / Linux 作業系統上(如 Windows), 無法度因為這一概念進行程式的設計—— 事實上,Windows 後的檔案描述子佮號誌、互斥鎖等核心物件仝款攏記做 HANDLE。
  • 因為檔案描述子咧形式毋過是一个整數,做程式碼量增加大時,會使程式的設計者誠歹分清佗一寡整數意味著資料,佗一寡意味出檔案來講。所以,完成的程式碼會當讀性也就會變甲真䆀,這點一般透過使用名稱有文字意義的魔術數字來進行替換來解決。

其他

  • 對於 ANSI C 規範當中定義的標準庫的檔案 I / O 操作。ANSI C 規範迵過出一个解決方法,就是使用 FILE 結構體的指標。事實上,UNIX / Linux 平台頂的 FILE 結構體的實作中往往攏是封囥檔案描述子變數佇咧其中。
  • 佇咧 UNIX / Linux 平台頂,對主控台(Console)的標準輸入,標準輸出,標準錯誤輸出嘛對應三个檔案描述子。𪜶分別是零 , 一 , 二。佇實際程式設計當中,若欲操作這三个檔案咧講,建議使用 < unistd . h > 標頭檔中定義的三个巨集來表示:STDIN \ _ FILENO , STDOUT \ _ FILENO 以及 STDERR \ _ FILENO .
  • 對一个行程來講,檔案描述子的變化範圍做零 ~ OPEN \ _ MAX .

佮檔案描述子相關的操作

檔案描述子的生成

  • open ( ) , open 六十四 ( ) , creat ( ) , creat 六十四 ( )
  • socket ( )
  • socketpair ( )
  • pipe ( )

佮單一檔案來講出手的操作

  • read ( ) , write ( )
  • recv ( ) , send ( )
  • recvmsg ( ) , sendmsg ( )
  • sendfile ( )
  • lseek ( ) , lseek 六十四 ( )
  • fstat ( ) , fstat 六十四 ( )
  • fchmod ( )
  • fchown ( )

佮複數檔案描述子相關的操作

  • select ( ) , pselect ( )
  • poll ( ) , epoll ( )

佮檔案來講表示相關的操作

  • close ( )
  • dup ( )
  • dup 二 ( )
  • fcntl ( F \ _ DUPFD )
  • fcntl ( F \ _ GETFD and F \ _ SETFD )

改變行程狀態的操作

  • fchdir ( )
  • mmap ( )

佮檔案加鎖的操作

  • flock ( )
  • fcntl ( F \ _ GETLK , F \ _ SETLK and F \ _ SETLKW )
  • lockf ( )

佮通訊端相關的操作

  • connect ( )
  • bind ( )
  • listen ( )
  • accept ( )
  • getsockname ( )
  • getpeername ( )
  • getsockopt ( ) , setsockopt ( )
  • shutdown ( )

其他

  • ioctl ( )

注釋

參考文獻