一般我們講,都說進程有文件描述符表,文件描述符表中的指針指向某個inode,這中間省略了file,dentry對象,對准確理解VFS結構無益,本文結合網絡所查,並根據APUE8.3和LKD13.11章節校對,總結在下,希望有用。
內核中,對應於每個進程都有一個文件描述符表,表示這個進程打開的所有文件。文件描述表中每一項都是一個指針,指向一個用於描述打開的文件的數據塊———file對象,file對象中描述了文件的打開模式,讀寫位置等重要信息,當進程打開一個文件時,內核就會創建一個新的file對象。需要注意的是,file對象不是專屬於某個進程的,不同進程的文件描述符表中的指針可以指向相同的file對象,從而共享這個打開的文件。file對象有引用計數,記錄了引用這個對象的文件描述符個數,只有當引用計數為0時,內核才銷毀file對象,因此某個進程關閉文件,不影響與之共享同一個file對象的進程.
file對象中包含一個指針,指向dentry對象。dentry對象代表一個獨立的文件路徑,如果一個文件路徑被打開多次,那么會建立多個file對象,但它們都指向同一個dentry對象。
dentry對象中又包含一個指向inode對象的指針。inode對象代表一個獨立文件。因為存在硬鏈接與符號鏈接,因此不同的dentry對象可以指向相同的inode對象.inode 對象包含了最終對文件進行操作所需的所有信息,如文件系統類型、文件的操作方法、文件的權限、訪問日期等。
打開文件后,進程得到的文件描述符實質上就是文件描述符表的下標,內核根據這個下標值去訪問相應的文件對象,從而實現對文件的操作。
注意,同一個進程多次打開同一個文件時,內核會創建多個file對象。
當進程使用fork系統調用創建一個子進程后,子進程將繼承父進程的文件描述符表,因此在父進程中打開的文件可以在子進程中用同一個描述符訪問。
關於vnode節點,是VFS一部分,我還沒來得及查證,但是如MOS(《現代操作系統》)10.6.4節所說,vnode用以識別inode是本地還是遠程的,屬於NFS的思想。日后再補。