檔案描述子
外觀
這是此頁批准,以及是最近的修訂。
檔案描述子(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 ( )