1. 程式人生 > >Unix程序對開啟檔案的管理

Unix程序對開啟檔案的管理

看下圖:
在這裡插入圖片描述

說明:

系統維護一個程序表,一個程序對應程序表裡面的一個程序項,程序項裡包含了此程序開啟的所有檔案的檔案描述符表資訊。
系統為所有開啟的檔案維護一張檔案表,每個程序的每一個檔案描述符對應一個檔案表項。
檔案表項裡有一個v節點表項指標,指向v節點表。v節點表在記憶體中,一個v節點表項對應一個檔案,儲存了檔案一些屬性資訊。

舉例,我們只看前兩個程序:

最上面程序開啟檔案a,對應fd0,開啟檔案b,對應fd1;
第二個程序開啟檔案a,對應fd0,然後用dup(fd0)返回得到fd1。
檔案表項1對應程序1開啟的檔案a;
檔案表項2對應程序1開啟的檔案b;
檔案表項3對應程序2開啟的檔案a。
v節點表項1記錄了檔案a的屬性;
v節點表項2記錄了檔案b的屬性。

結論:

同一個程序下的不同檔案描述符可能指向同一個檔案表項(比如下面將要講的dup函式返回的新描述符和原描述符就指向同一個檔案表項)。
不同程序開啟的即使是相同的檔案,也對應不同的檔案表項,因為要各自擁有自己的檔案偏移量。
但是一個檔案只有一個v節點表項,所以不同檔案表項可能會指向同一個v節點表項(只要是同一個檔案)。


複製檔案描述符:

#include <unistd.h>
int dup(int filedes);
int dup2(int filedes, int filedes2);
//成功則返回新的檔案描述符,出錯返回-1

dup返回的檔案描述符一定為當前可用檔案描述符的最小數值。
dup2可以指定新描述符的數值,若filedes2已經開啟,則先將其關閉,若filedes2 == filedes,則返回filedes2而不關閉。