在linux系統中一切都可以看作是檔案,檔案又分為:普通檔案、目錄檔案、鏈結檔案和裝置檔案。檔案描述符是核心為了高效管理已被開啟的檔案所建立的索引,起值是乙個非負整數,用於指代被開啟的檔案,所有執行i/o操作的系統呼叫都通過檔案描述符。
每乙個檔案描述符會與乙個開啟檔案相對應,同時,不同的檔案描述符也會指向同乙個檔案。相同的檔案可以被不同的程序開啟也可以在同乙個程序中被多次開啟。系統為每乙個程序維護了乙個檔案描述符表,該錶的值都是從0開始的,所以在不同的程序中你會看到相同的檔案描述符,這種情況下相同檔案描述符有可能指向同乙個檔案,也有可能指向不同的檔案。具體情況要具體分析,要理解具體其概況如何,需要檢視由核心維護的3個資料結構。
1. 程序級的檔案描述符表
2. 系統級的開啟檔案描述符表
3. 檔案系統的i-node表
程序級的描述符表的每一條目記錄了單個檔案描述符的相關資訊。
1. 控制檔案描述符操作的一組標誌。(目前,此類標誌僅定義了乙個,即close-on-exec標誌)
2. 對開啟檔案控制代碼的引用
核心對所有開啟的檔案的檔案維護有乙個系統級的描述符**(open file description table)。有時,也稱之為開啟檔案表(open file table),並將**中各條目稱為開啟檔案控制代碼(open file handle)。乙個開啟檔案控制代碼儲存了與乙個開啟檔案相關的全部資訊,如下所示:
1. 當前檔案偏移量(呼叫read()和write()時更新,或使用lseek()直接修改)
2. 開啟檔案時所使用的狀態標識(即,open()的flags引數)
3. 檔案訪問模式(如呼叫open()時所設定的唯讀模式、只寫模式或讀寫模式)
4. 與訊號驅動相關的設定
5. 對該檔案i-node物件的引用
6. 檔案型別(例如:常規檔案、套接字或fifo)和訪問許可權
7. 乙個指標,指向該檔案所持有的鎖列表
8. 檔案的各種屬性,包括檔案大小以及與不同型別操作相關的時間戳
1. 由於程序級檔案描述符表的存在,不同的程序中會出現相同的檔案描述符,它們可能指向同乙個檔案,也可能指向不同的檔案。
2. 兩個不同的檔案描述符,若指向同乙個開啟檔案控制代碼,將共享同一檔案偏移量。因此,如果通過其中乙個檔案描述符來修改檔案偏移量(由呼叫read()、write()或lseek()所致),那麼從另乙個描述符中也會觀察到變化,無論這兩個檔案描述符是否屬於不同程序,還是同乙個程序,情況都是如此。
4. 檔案描述符標誌(即,close-on-exec)為程序和檔案描述符所私有。對這一標誌的修改將不會影響同一程序或不同程序中的其他檔案描述符
linux檔案描述符與開啟檔案之間的關係
1.概述 在linux系統中一切皆可以看成是檔案,檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的系統呼叫都通過檔案描述符。程式剛...
檔案描述符與開啟檔案的關係
所有執行i o操作的系統呼叫都以檔案描述符,即乙個非負整數來指代所開啟的檔案。檔案描述符可以用來表示所有型別的已開啟檔案。同時,多個檔案描述符可以指向同乙個開啟檔案,因為有在不同程序中開啟同乙個檔案的需求。那麼,系統是如何維護硬碟檔案與檔案描述符之間的聯絡呢?要理解具體的情況如何,需要檢視由核心維護...
linux檔案描述符與開啟檔案的關係
1.概述 在linux系統中一切皆可以看成是檔案,檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的系統呼叫都通過檔案描述符。程式剛...