[Linux] 檔案描述符和開啟檔案之間的關係
阿新 • • 發佈:2019-02-20
前言
檔案描述符、檔案控制代碼和i-node之間的關係,應該是Linux Native Programming的基本功。Golang、C++11寫久了之後,這些概念有些淡忘,今天順便梳理下。
鋪墊
為了搞清楚這當中的關係,我們首先要了解核心維護的3個數據結構:
- 程序級的檔案描述符表
- 系統級的開啟檔案控制代碼
- 檔案系統級的i-node表
程序級的檔案描述符表
單條表項,包括:
- 檔案描述符標誌,如close_on_exec標誌;
- 對應檔案控制代碼的索引
系統級的開啟檔案控制代碼
單條表項,包括:
- 當前檔案偏移
- 檔案開啟標誌、訪問許可權
- 對應inode物件的索引
檔案系統級的i-node表
單條表項,包括:
- 檔案型別和訪問許可權
- 檔案的基本屬性
分析
在前面,我們對基本概念進行了鋪墊;接下來,我們結合下圖進行更加細緻的分析。
- 在程序A中,檔案描述符1和檔案描述符20指向同一個檔案控制代碼23,這可能是dup()系統呼叫的結果;
- 程序A的檔案描述符2和程序B的檔案描述符2指向同一個檔案控制代碼70,這可能是fork()後的結果(程序A、B互為父子程序);
- 程序A的檔案描述符0和程序B的檔案描述符3雖然指向不同的開啟檔案控制代碼,但是各自的開啟檔案控制代碼均指向inode表中的同一項, 這可能是程序獨自對同一檔案發起了open()呼叫;
表象
- 兩個不同的檔案描述符,若指向同一開啟檔案控制代碼,將共享同一檔案偏移量;如果其中一個檔案描述符操作了檔案偏移,則另一個檔案描述符也將受影響;
- 兩個不同的檔案描述符,若指向同一開啟檔案控制代碼,將共享檔案標誌;如果其中一方通過fcntl修改了檔案flag,則另一方也將受到影響;
- 檔案描述符標誌(close_on_exec)為程序中的檔案描述符所私有。
參考文獻
TLPI