1. 程式人生 > >檔案描述符與檔案指標的區別

檔案描述符與檔案指標的區別

檔案指標:C語言中使用檔案指標做為I/O的控制代碼。檔案指標指向程序使用者區中的一個被稱為FILE結構資料結構。FILE結構包括緩衝區檔案描述符。而檔案描述符是檔案描述符表的一個索引,也就是說c語言的檔案指標是Linux系統中對檔案描述符的一種封裝

下面看FILE結構體裡面都有那些成員


上面是檔案指標指向的結構體,可以發現檔案指標結構體包含檔案描述符,說明檔案指標是對檔案描述符的一種封裝。檔案指標是C語言庫裡的提供的一個結構體,檔案描述符是系統呼叫介面

為什麼系統已經有了檔案描述符,庫裡面還要對其做一層封裝呢?也是優點:一、方便程式設計師使用;二、可以提高程式的移植性。

FILE結構體裡面還有緩衝區:

將資料寫入硬碟檔案中時,緩衝區的重新整理方式預設為全緩衝,

將資料寫入顯示檔案中,緩衝區的重新整理方式預設為行緩衝;

而系統呼叫的函式write()寫入時,是沒有緩衝的,是因緩衝區是C庫提供的,在FILE結構體裡。檔案描述符和緩衝區都是FILE結果體的成員,所以檔案描述符指向的file結構體裡是沒有緩衝區的。


檔案描述符:Linux系統中開啟檔案就會獲得檔案描述符,它是個很小的正整數。每個程序在PCB(Process Control Block)中儲存著一份檔案描述符表,檔案描述符就是這個表的索引,每個表項都有一個指向已開啟檔案的指標,已開啟的檔案在核心中用file結構體表示,檔案描述符表中的指標

指向file結構體


標準輸入(stdin)的檔案描述符是 0

標準輸出(stdout)的檔案描述符是 1

標準錯誤(stderr)的檔案描述符是 2

檔案描述符的分配規則:從當前未被分配的最小整數處分匹配。

下面看檔案file結構體


shell 和很多應用程式都使用這種習慣,因此,如果核心不遵循這種習慣的話,很多應用程式將不能使用。
POSIX 定義了 STDIN_FILENOSTDOUT_FILENO STDERR_FILENO 來代替
 012。這三個符號常量的定義位於標頭檔案 unistd.h。

檔案描述符的有效範圍是 0 到 OPEN_MAX。一般來說,每個程序最多可以開啟 64 個檔案

(0 — 63)。對於 FreeBSD 5.2.1、Mac OS X 10.3 和 Solaris 9 來說,每個程序最多可以開啟檔案的多少取決於系統記憶體的大小,int 的大小,以及系統管理員設定的限制。Linux 2.4.22 強制規定最多不能超過 1, 048, 576 。
優點
相容POSIX標準,許多Linux和UNIX系統呼叫都依賴於它。
缺點
檔案描述符的概念存在兩大缺點 :
一、在非UNIX / Linux作業系統上(如Windows NT),無法基於這一概念進行程式設計。
二、由於檔案描述符在形式上不過是個整數,當代碼量增大時,會使程式設計者難以分清哪些整數意味著資料,那些意味著檔案描述符。因此,完成的程式碼可讀性也就會變得很差。