看下圖:
系統維護乙個程序表,乙個程序對應程序表裡面的乙個程序項,程序項裡包含了此程序開啟的所有檔案的檔案描述符表資訊。
系統為所有開啟的檔案維護一張檔案表,每個程序的每乙個檔案描述符對應乙個檔案表項。
檔案表項裡有乙個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
intdup
(int filedes)
;int
dup2
(int filedes,
int filedes2)
;//成功則返回新的檔案描述符,出錯返回-1
dup返回的檔案描述符一定為當前可用檔案描述符的最小數值。
dup2可以指定新描述符的數值,若filedes2已經開啟,則先將其關閉,若filedes2 == filedes,則返回filedes2而不關閉。
fork父子程序對開啟檔案的共享
父子程序是共享檔案表 檔案狀態標誌 當前檔案偏移量和v節點指標 的,和相互獨立程序不一樣。詳細見unix高階環境程式設計p175.include include include include include include int main void close fd exit 1 sleep 2...
unix程序管理命令
語法 kill 訊號 程序號 說明 kill 將訊號傳遞給指定程序,訊號意義如下 1 暫停 hangup 2 中斷 interrupt 3 退出 quit 4 非法指令 illegal instruction 5 跟蹤中斷 trace trap 6 abort 7 emt 指令 emulation ...
linux中fork對開啟檔案的處理
1 子程序複製父程序的資料段 bbs段 段 堆空間 棧空間和檔案描述符 2 對於檔案描述符採用共享的方式 後面這個例子可以清晰的看出 1 include 2 include 3 include 4 include 5 include 6 include 7 8int main 923 父程序向檔案寫...