Unix程序對開啟檔案的管理

2021-09-02 15:03:58 字數 932 閱讀 2332

看下圖:

系統維護乙個程序表,乙個程序對應程序表裡面的乙個程序項,程序項裡包含了此程序開啟的所有檔案的檔案描述符表資訊。

系統為所有開啟的檔案維護一張檔案表,每個程序的每乙個檔案描述符對應乙個檔案表項。

檔案表項裡有乙個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 父程序向檔案寫...