Linux 檔案描述符和檔案指標

2021-07-31 18:06:57 字數 1495 閱讀 9066

一、檔案描述符

- 1、概念:

在linux下一切皆檔案的思想,檔案被分為普通檔案,目錄檔案,鏈結檔案和裝置檔案。

檔案描述符是核心為了高效管理已被開啟的檔案所建立的索引,它是乙個非負整數,用於指代被開啟的檔案,所有執行i/o操作的系統呼叫都要通過檔案描述符。

程式剛啟動的時候,0,1,2分別表示標準輸入,標準輸出,標準錯誤。因此此時當我們開啟乙個檔案的時候,他的檔案描述符是3。

二、檔案描述的限制

系統限制:一般最大開啟檔案數是系統記憶體的10%(以kb來算的)

可以用命令檢視:sysctl -a |grep fs.file-max

使用者限制:為了不讓乙個程序消耗掉所有的檔案資源,也會對單個程序最大開啟檔案數做預設處理,一般預設1024

可以用命令檢視:ulimit -n

三、檔案描述符和開啟檔案之間的關係:

簡單來說:在open的時候產生,起到乙個索引的作用,通過程序的task_struct中儲存的檔案描述符表找到該fd所指向的檔案指標以開啟檔案的指標。

不同的程序會有相同的檔案描述符,相同的檔案描述符又可能指向同乙個檔案,也可能指向不同的檔案。

每乙個檔案描述符會與乙個開啟檔案相對應,不同的檔案描述符也會指向同乙個檔案。

相同的檔案可以被不同的程序開啟也可以在同乙個程序中被多次開啟

那麼我們就要進行具體的分析,需要檢視有核心維護的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)缺點:由於是系統呼叫,因此移植性很差

檔案指標和檔案描述符

原文 檔案描述符 在linux系統中,裝置也是以檔案的形式存在,要對該裝置進行操作就必須先開啟這個檔案,開啟檔案就會獲得檔案描述符,它是個很小的正整數。每個程序在pcb process control block 中儲存著乙份檔案描述符表,檔案描述符就是這個表的索引,每個表項都有乙個指向已開啟檔案的...

檔案指標和檔案描述符

檔案描述符 在linux系統中,裝置也是以檔案的形式存在,要對該裝置進行操作就必須先開啟這個檔案,開啟檔案就會獲得檔案描述符,它是個很小的正整數。每個程序在pcb process control block 中儲存著乙份檔案描述符表,檔案描述符就是這個表的索引,每個表項都有乙個指向已開啟檔案的指標。...

檔案描述符和檔案指標區別

int fileno file stream 返回stream對應的檔案描述符。file fdopen int filedes,const char mode 從檔案描述符fd 到檔案流 file 的函式 檔案描述符,在linux系統中,裝置也是以檔案的形式存在,要對該裝置進行操作就必須先開啟這個檔...