程序呼叫fork與檔案描述符的共享

2021-06-23 00:29:02 字數 1380 閱讀 7716

linux的程序描述task_struct{}中有乙個陣列專門用於記錄一開啟的檔案,其中檔案描述符作為該陣列的下標,陣列元素為指向所開啟的檔案所建立的檔案表項。如下圖所示,檔案表項是用於描述檔案當前被某個程序開啟後的狀態資訊,包括檔案狀態標誌,記錄當前檔案讀取的位移量(可以通過介面lseek設定),以及檔案的i節點指標(i節點描述檔案的具體資訊,如:建立,修改時間,檔案大小,檔案儲存的塊資訊)。

不同程序開啟同乙個檔案後,程序表和檔案表的關係如下圖所示:

程序的所開啟檔案和在fork後的結構圖如下所示,子程序是共享父程序的檔案表項;

可以通過乙個測試例項來證實以上的描述:

測試原始碼

#include

#include

#include

#include

intmain()  

nr = read(fd1,buff,10);  

buff[nr]='\0'

;  printf("pid#%d content#%s#\n"

,getpid(),buff);  

return

0;  

}  

測試用例

[html]view plain

copy

data.in  

abcdefghijklmnopqrstuvwxyz1234567890  

eof  

測試結果:

pid#20029 content#abcdefghij#

pid#20030 content#klmnopqrst#

結果分析:

程序20029對檔案的讀取後的當前位置應該為data.in的k字元所在的位置,程序20030是由20029程序之後開始讀取的,他讀取檔案內容不是從a開始,而是從k開始,說明20030共享了20029的檔案表。

程序呼叫fork後,子程序和父程序的檔案描述符所對應的檔案表項是共享的,這意味著子程序對檔案的讀寫直接影響父程序的檔案位移量(反之同理)。

程序中呼叫fd2 = dump(fd1) 產生的新的fd2所指向的檔案表項和fd1指向的檔案表項是相同的;

程序中分別呼叫:fd1 = open("data.in",o_rdwr); fd2 = open("data.in",o_rdwr); 那麼fd1和fd2指向的檔案表項是不同的。

mysql 檔案描述符 檔案描述符

toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...

呼叫門描述符

門描述符跟段描述符的結構不同。2.它定義了在指定 段例程的入口點 偏移 3.它指定了呼叫者嘗試去訪問例程所需要的特權級 dpl 這裡是訪問者所要具備的特權級 4.如果發生了棧切換,它指定了拷貝到新棧的可選引數的數量 5位最多32個 也就是說,在跳到r0執行相應例程的時候,特權級便了,使用的棧也會改變...

檔案描述符

檔案描述符 是個很小的正整數,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。檔案描述符的優點 相容posix標準,許多 linux 和unix 系統呼叫都依賴於它。檔案描述符的缺點 不能移植到unix以外的系統上去,也不直觀。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案...