1. 程式人生 > >檔案描述符、檔案表項、V節點表項的一些總結

檔案描述符、檔案表項、V節點表項的一些總結

         看書的時候對這三樣東西把握得不太清楚,嗯,所以寫篇blog來總結一下。

檔案描述符(程序級別):

       1)、在每個程序表中都有一個記錄項,記錄項中包含有一張開啟檔案描述符表,可將其視察為一個向量(陣列),每個描述符佔用一項。與每個檔案描述符相關聯的是:

       (a)、檔案描述符標誌。

       (b)、指向一個檔案表項的指標。(不同的檔案描述符可以指向同一個檔案表項,例如用dup函式複製檔案描述符,得到一個新的檔案描述符,但是它們指向同一個檔案表項,因此它們也指向同一個V節點表。)

    檔案表項(全域性級別,所有程序共享?自己YY的)

        2)、核心為所有開啟的檔案維持一張檔案表(同一個檔案可以被開啟多次,所以同一個檔案可以在檔案表中佔有多項)。每個檔案表項包含:

       (a)、檔案狀態標誌(讀、寫、添寫、同步和非阻塞等)

       (b)、當前檔案偏移量(不同的檔案表項的V節點指向可以指向同個V節點表,也就是指向同一個真實的物理檔案。因為一個檔案表項裡包含當前檔案偏移量,所以不同的檔案表項看到同一檔案的偏移量可以不同,這種安排可以使每個程序都有它自己的對該檔案的當前偏移量。)

       (c)、指向該檔案的V節點表項的指標。

           V節點表項(全域性級別?所有程序共享?自己YY的)

        (3)、每個開啟檔案(或裝置)都有一個V節點結構。V節點包含了檔案型別和對此檔案進行各種操作的函式的指標。對於大多數檔案,V節點還包含了該檔案的I節點。

------------------------------------------------分割---------------------------------------------------------------------

再稍微總結一下它們各自的對應關係:

一個檔案描述符對應一個檔案表項,而一個檔案表項又對應一個V節點表項。不同的檔案描述符可以指向同一個檔案表項(可以通過dup複製檔案描述符等方式),從而指向同一個V節點表項。與此相似,不同的檔案表項也可以指向同一個V節點表項。例如fd1 = open(pathname,...),fd2 = open(pathname....),因為它們各自打開了自己看到的檔案,雖然是同一個檔案,但是還是它們擁有不同的檔案描述符,指向不同的檔案表項(前面說過的,核心為所有開啟的檔案維持一張檔案表(同一個檔案可以被開啟多次,所以同一個檔案可以在檔案表中佔有多項)

)。不過,因為是同一個檔案,所以它們的檔案表項裡的V節點指標指向的是同一個V節點表項。

再簡單些總結就是;檔案描述符與檔案表對應關係就是:一對一,或者多對一。而檔案表項與V節點表項的關係就是:

一對一,或者多對一。

PS:以上部分抄於《Unix環境高階程式設計》,部分屬於自己YY,YY的那部分完全沒有驗證其正確性。所以如果有錯,請前輩們、朋友們指出~~~謝謝