fork函式細究

2021-08-03 09:50:29 字數 1797 閱讀 7553

fork後的父子程序特點:

1. 子程序是父程序的乙個拷貝(

子程序從父程序得到了資料段和堆疊段的拷貝,這些需要分配新的記憶體;而對於唯讀的**段,通常使用共享記憶體的方式訪問,

),為了提高效率,現在通常使用寫時拷效率貝技術來提高xiao'lü。即: 這些區域由父子程序共享,而且核心將他們的訪問許可權變為唯讀的,如果父子程序中的任何乙個試圖修改這些區域,則核心只為修改區域的那塊記憶體製作乙個副本。

2.父程序與子程序的不同之處在於: 返回值不同:給父程序返回的是子程序的pid,給子程序返回的是0

3.fork返回後,子程序和父程序都從呼叫fork函式的下一條語句開始執行:條件判斷是用來執行各自程序所需要的操作,但若沒有條件判斷或條件判斷結束 父子程序仍然需要分別執行fork後的**。

4.fork的乙個特性是父程序的所有開啟檔案描述符都被複製到子程序中,父子程序的每個相同的檔案描述符共享乙個檔案表項。要想使子程序和父程序同時重定向到某乙個檔案,則重定向的操作必須在fork之前:因為子程序是父程序的乙份拷貝。

特點第四條證明:

一:重定向操作放在fork之前

現象:

標準輸出不能輸出資料,父子程序的資料都被重定向到fork檔案中

二: 重定向放在fork之後

現象:

子程序的標準輸出沒有重定向成功,螢幕上輸出了子程序的pid和ppid,父程序的標準輸出重定向成功,父程序的資料被重定向到fork檔案中。

但是。當讓父程序推遲兩秒執行,子程序不推遲執行,會發現:此時子程序重定向到fork成功,而父程序重定向失敗.

------總結一下:對於fork之後的重定向:

1.在fork之後,兩個程序對檔案fork開啟了兩次,對於open 引數為 o_rdwr|o_creat 的時候,其中有乙個程序開啟檔案失敗,所以造成了重定向失敗。

2. 對於open引數是o_rdwr 的時候,兩個程序都開啟成功,但因為父程序sleep了兩秒,所以父程序的資料把子程序的資料給覆蓋了。     

fork**注意事項:

1. 在沒有呼叫exec之前,父子程序共享**段,兩者的**完全相同 

呼叫fork函式之後,條件判斷父子程序執行對應的操作之後,在其後面的**, 因為父子程序**段的共享,所以子程序也會去執行

2.  

fork之前的輸出若是無緩衝輸出,則子程序拷貝的緩衝區中沒有資料,反之,若是行緩衝(沒有\n)或者全緩衝(緩衝區為滿):

子程序會把父程序的緩衝區也拷貝乙份,當每個程序終止時或者行緩衝遇到\n或者緩衝區滿時,其緩衝區的內容都被寫到相應檔案中:

3. 檔案描述符: 當父程序的檔案描述符被重定向,子程序的檔案描述符也會被重定向

fork有兩種用法:

1 ,乙個父程序希望複製自己,使父程序和子程序同時執行不同的**段

2. 乙個程序要執行乙個不同的程式,如shell,這種情況下fork之後要立即呼叫exec

fork失敗的主要原因:

1.系統中存在太多的程序

2.該實際使用者id的程序總數超過了系統限制

fork 函式 fork 函式的使用

fork的意思是個叉子,在unix及其衍生版linux中,用於建立子程序,現在看一下fork函式的基本用法。include includeint main printf c b fflush stdout fork printf c c fflush stdout 上圖的輸出是什麼呢?答案是 bab...

c 中的fork函式 FORK()函式

乙個程序,包括 資料和分配給程序的資源。fork 函式通過系統呼叫建立乙個與原來程序幾乎完全相同的程序,也就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事。乙個程序呼叫fork 函式後,系統先給新的程序分配資源,例如儲存資料和 的空間。然後把原來的程序的所有...

死鎖習題細究

2015.26 若系統s1採用死鎖避免方法,s2採用死鎖檢測方法。下列敘述中正確的是 b.i.s1會限制使用者申請資源的順序,而s2不會 ii.s1需要程序執行所需要的資源總量資訊,而s2不需要 iii.s1不會給可能導致死鎖的程序分配資源,而s2會 a.i ii b.ii iii c.i iii ...