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