File-Descriptors

什麼是打開文件描述?

  • August 9, 2019

當您分叉一個程序時,子程序繼承其父程序的文件描述符。我知道當這種情況發生時,孩子會收到一份父母的文件描述符表的副本,每個表中的指針都指向相同的打開文件描述。這與http://en.wikipedia.org/wiki/File_descriptor中的文件表相同,還是其他?

我在 open system call的文件中找到了答案:

術語打開文件描述是 POSIX 用來指代系統範圍的打開文件表中的條目的描述。在其他上下文中,這個對像也被稱為“打開的文件對象”、“文件句柄”、“打開的文件表條目”,或者——用核心開發者的說法——結構文件。當一個文件描述符被複製時(使用 dup(2) 或類似的方法),副本指的是與原始文件描述符相同的打開文件描述,因此兩個文件描述符共享文件偏移量和文件狀態標誌。這種共享也可以在程序之間發生:通過 fork(2) 創建的子程序繼承其父文件描述符的副本,這些副本引用相同的打開文件描述。文件的每個 open(2) 都會創建一個新的打開文件描述;因此,

文件描述符→打開文件描述→目錄條目

               dup                open                    cp

當從程序中的打開文件一直到文件內容時,有幾個級別的間接。在實現方面,這些級別通常轉換為核心中指向下一個級別的資料結構。我將描述一個簡單的實現;真正的實現可能會有更多的複雜性。

程序中打開的文件由文件描述符指定,該文件描述符是一個小的非負整數。數字 0、1 和 2 具有正常含義:程序應該從 0(標準輸入)讀取正常輸入,將正常輸出寫入 1(標準輸出),並將錯誤消息寫入 2(標準錯誤)。這只是一個約定:核心不在乎。核心為每個程序保留一個打開文件描述符表,將這些小整數映射到文件描述符結構。在 Linux 核心中,這種結構是struct fd.

文件描述符結構包含一個指向打開文件描述的指針。可以有多個文件描述符指向同一個打開的文件描述,來自多個程序,例如當一個程序呼叫dup和友元時,或者在一個程序分叉之後。如果文件描述符(即使在不同的程序中)是由於相同的原始open(或相似)系統呼叫,它們共享相同的打開文件描述。打開文件描述包含文件打開方式的資訊,包括模式(只讀vs讀寫、追加等)、在文件中的位置等。在Linux下,打開文件描述結構為struct file.

打開的文件描述位於文件 API 級別。下一個級別是文件系統API。區別在於文件 API 涵蓋了不存在於文件系統樹中的文件,例如匿名管道和套接字。如果文件是目錄樹中的文件,則打開的文件描述包含指向目錄條目的指針。如果同一個文件被多次編輯,則可以有多個打開的文件描述指向同一個目錄條目open。目錄條目包含有關文件是什麼的資訊,包括指向其父目錄的指針,以及有關文件所在位置的資訊。在 Linux 核心中,目錄條目分為兩級:struct inode包含文件元數據和struct dentry它跟踪文件在目錄樹中的位置。

引用自:https://unix.stackexchange.com/questions/195057