檔案描述符與檔案指標的區別
檔案指標:C語言中使用檔案指標做為I/O的控制代碼。檔案指標指向程序使用者區中的一個被稱為FILE結構的資料結構。FILE結構包括緩衝區和檔案描述符。而檔案描述符是檔案描述符表的一個索引,也就是說c語言的檔案指標是Linux系統中對檔案描述符的一種封裝。
下面看FILE結構體裡面都有那些成員
上面是檔案指標指向的結構體,可以發現檔案指標結構體裡包含有檔案描述符,說明檔案指標是對檔案描述符的一種封裝。檔案指標是C語言庫裡的提供的一個結構體,檔案描述符是系統呼叫介面;
為什麼系統已經有了檔案描述符,庫裡面還要對其做一層封裝呢?也是優點:一、方便程式設計師使用;二、可以提高程式的移植性。
FILE結構體裡面還有緩衝區:
將資料寫入硬碟檔案中時,緩衝區的重新整理方式預設為全緩衝,
將資料寫入顯示檔案中,緩衝區的重新整理方式預設為行緩衝;
而系統呼叫的函式write()寫入時,是沒有緩衝的,是因緩衝區是C庫提供的,在FILE結構體裡。檔案描述符和緩衝區都是FILE結果體的成員,所以檔案描述符指向的file結構體裡是沒有緩衝區的。
檔案描述符:在Linux系統中開啟檔案就會獲得檔案描述符,它是個很小的正整數。每個程序在PCB(Process
Control Block)中儲存著一份檔案描述符表,檔案描述符就是這個表的索引,每個表項都有一個指向已開啟檔案的指標,已開啟的檔案在核心中用file結構體表示,檔案描述符表中的指標
標準輸入(stdin)的檔案描述符是 0
標準輸出(stdout)的檔案描述符是 1
標準錯誤(stderr)的檔案描述符是 2
檔案描述符的分配規則:從當前未被分配的最小整數處分匹配。
下面看檔案file結構體
shell 和很多應用程式都使用這種習慣,因此,如果核心不遵循這種習慣的話,很多應用程式將不能使用。
POSIX 定義了 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO
來代替 0、1、2。這三個符號常量的定義位於標頭檔案 unistd.h。
檔案描述符的有效範圍是 0 到 OPEN_MAX。一般來說,每個程序最多可以開啟
64 個檔案
優點
相容POSIX標準,許多Linux和UNIX系統呼叫都依賴於它。
缺點
檔案描述符的概念存在兩大缺點 :
一、在非UNIX / Linux作業系統上(如Windows NT),無法基於這一概念進行程式設計。
二、由於檔案描述符在形式上不過是個整數,當代碼量增大時,會使程式設計者難以分清哪些整數意味著資料,那些意味著檔案描述符。因此,完成的程式碼可讀性也就會變得很差。