Linux 文件描述符是什么?
我們?nèi)绾瓮ㄟ^文件描述符與 Linux 文件系統(tǒng)交互?
文件描述符代表一個打開的文件。它是操作系統(tǒng)分配給每個文件的唯一編號。它是處理文件的一個抽象概念。我們需要使用文件描述符來讀取或?qū)懭氤绦蛑械奈募?。每個進程都維護自己的文件描述符表。
下圖顯示了 Linux 文件系統(tǒng)的分層架構(gòu)。讓我們以進程 1234 為例。
1.用戶空間
當我們在進程 1234 中打開一個名為 “fileA.txt ”的文件時,會得到文件描述符 fd1,它等于 3。然后,我們可以將文件描述符傳遞給其他函數(shù),向文件寫入數(shù)據(jù)。
2.內(nèi)核空間
在 Linux 內(nèi)核中,有一個進程表來維護進程的數(shù)據(jù)。每個進程在表中都有一個條目。每個進程都維護一個以文件描述符為索引的文件描述符表。請注意,每個文件描述符表中都保留了文件描述符 0、1 和 2,分別代表 stdin、stdout 和 stderr。
文件指針指向打開文件表中的一個條目,該表包含所有進程中打開文件的信息。多個文件描述符可以指向同一個文件表項。例如,文件描述符 0、1 和 2 指向同一個打開文件表項。
由于不同的打開文件表項可以代表同一個文件,因此多次存儲文件靜態(tài)信息是一種資源浪費。我們需要另一個名為 “vnode 表 ”的抽象層來存儲靜態(tài)數(shù)據(jù)。
在每個文件表條目中,都有一個 vnode 指針,它指向 vnode 表中的一個條目。靜態(tài)信息包括文件類型、函數(shù)指針、引用計數(shù)、inode 等。
3.文件系統(tǒng)
inode 數(shù)組元素存儲實際文件信息,包括權(quán)限模式、所有者、時間戳等。