提個問題:如果程序在fork之前開啟了一些檔案,那麼 fork 完之後,這些檔案的描述符是共享的,還是不共享的?
父程序和子程序的空間是隔離的,所以,開啟的檔案也應該是不共享的吧?答案是no;
假設現在是linux32位系統,程序空間有4g的大小;這4g空間並不是完全隔離的;
實際上程序空間被分割為使用者空間和核心空間。對於32 位 linux 來說,從 0-3gb 的空間是使用者空間,從 3gb - 4gb 是核心空間。對於乙個程序來說,是絕對無法讀寫核心空間的;
或者說,程序的使用者空間是隔離的,而核心空間是共享的;看起來有點像下面的圖;
對於乙個程序來說,它所有開啟的描述符,都會有記錄;
而且這些記錄,儲存該程序的 pcb 結構體中(pcb位於核心空間),該結構體有乙個成員 struct file *flip[nr_open],就儲存了所有開啟的檔案;如下圖:
這時候,struct file 中的 f_count 都會自增 1.
上圖告訴我們的乙個事實是,fork 完後的父子程序,共享 struct file 結構(因為該結構位於核心空間);在《apue》 這本書中,把 struct file 稱為檔案表。
除了開啟的檔案外,父程序的很多其他性質也會被子程序共享,比如各種 id 號、當前工作目錄、根目錄、資源的限制、訊號遮蔽字、程序環境、檔案開啟執行時關閉標誌、共享儲存段;
程序呼叫fork與檔案描述符的共享
linux的程序描述task struct 中有乙個陣列專門用於記錄一開啟的檔案,其中檔案描述符作為該陣列的下標,陣列元素為指向所開啟的檔案所建立的檔案表項。如下圖所示,檔案表項是用於描述檔案當前被某個程序開啟後的狀態資訊,包括檔案狀態標誌,記錄當前檔案讀取的位移量 可以通過介面lseek設定 以及...
fork父子程序對開啟檔案的共享
父子程序是共享檔案表 檔案狀態標誌 當前檔案偏移量和v節點指標 的,和相互獨立程序不一樣。詳細見unix高階環境程式設計p175.include include include include include include int main void close fd exit 1 sleep 2...
程序建立函式fork與vfork
1.fork 1 函式的功能 建立乙個程序 2 函式的原型 pid t fork void 3 函式的返回值 0 出錯 0 子程序 0 父程序 其值為子程序的識別號 4 標頭檔案 include fork的奇妙之處在於它被呼叫一次,卻返回兩次,它可能有三種不同的返回值。include include...