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