fork函式總結

2021-07-05 03:01:57 字數 2712 閱讀 8168

在unix/linux中用fork函式建立乙個新的程序。程序是由當前已有程序呼叫fork函式建立,分叉的程序叫子程序,建立者叫父程序。該函式的特點是呼叫一次,返回兩次,一次是在父程序,一次是在子程序。兩次返回的區別是子程序的返回值為0,父程序的返回值是新子程序的id。子程序與父程序繼續併發執行。如果父程序繼續建立更多的子程序,子程序之間是兄弟關係,同樣子程序也可以建立自己的子程序,這樣可以建立起定義關係的程序之間的一種層次關係。

程式包含位於記憶體的多個組成部分,執行程式的過程將根據需要來訪問這些內容,包括文字段(text segment)、資料段(data segments)、棧(stack)和堆(heap)。文字段中存放cpu所執行的命令,資料段存放程序操作的所有資料變數,棧存放自動變數和函式資料,堆存放動態記憶體分配情況資料。當程序被建立時,子程序收到父程序的資料副本,包括資料空間、堆、棧和程序描述符。

程式1:建立乙個子程序,子程序對繼承的資料進行修改,然後分別輸出父子程序的資訊。程式如下:

fork函式執行後程式結構圖如下:

子程序與父程序並行執行,因此在父程序中sleep(10),讓子程序先執行,然後再執行父程序。

程式執行結果如下所示:

如何建立多個子程序呢?在開發併發伺服器時,用到的程序池模型需要先建立指定書目的子程序。舉個例子,假如我們現在需要建立2個子程序,很容易想到的是呼叫乙個迴圈,執行fork函式2次即可。嘗試一下是否可行呢?**如下:

程式執行結果如下:

從結果來看,子程序的數目不是2而是3,這是為什麼呢?先簡單的分析一下:從結果看出父程序id為10669,子程序的id分別為:10670、10671、10672。

父子程序之間的關係如下:

id為10670的子程序也呼叫fork函式,建立了乙個程序。因為fork函式建立的程序是父程序的乙份拷貝,儲存了當前的資料空間、堆、棧及共享**區域。正確的方式應該是在子程序中跳出,停止繼續fork。改進的**如下:

程式執行結果如下:

從結果可以看出這父程序(id為10789)建立了兩個子程序(id分別為:10790、10791)。

現有有這樣乙個面試題,程式如下:

1 #include 2 #include 3 #include 4 #include 5

6int

main()

7

要求如下:

已知從這個程式執行到這個程式的所有程序結束這個時間段內,沒有其它新程序執行。

1、請說出執行這個程式後,將一共執行幾個程序。

2、如果其中乙個程序的輸出結果是「pid1:1001, pid2:1002」,寫出其他程序的輸出結果(不考慮程序執行順序)。

這個題目考查fork函式的理解。fork的作用是複製乙個與當前程序一樣的程序。新程序的所有資料(變數、環境變數、程式計數器等)數值都和原程序一致,但是是乙個全新的程序,並作為原程序的子程序,父子程序並行的執行剩下的部分。

程式的執行過程如下:

(1)程式開始執行時候系統分配乙個程序進行執行,稱該程序為主程序p,程序id題目未給,

(2)主程序執行到第乙個fork函式的時候,建立乙個新的子程序p1,有題目可知程序id為1001,fork函式有兩個返回值,返回pid=0代表子程序p1,pid1>0代表父程序p。

(3)現在有兩個程序p和p1,分別執行剩下部分,

(4)p程序(父程序,所以pid1=1001)呼叫fork建立子程序p2,返回兩個值中pid2=1002表示p2的程序id返回給父程序p,pid2=0子程序p2本身,所以輸出pid1=1001,         pid2=1002和pid1=1001,pid2=0。

(5)p1程序(子程序,所以pid1=0)呼叫fork建立子程序p3,程序id類推為1003,返回兩個值中pid2=1003表示p3的程序id返回給父程序p1,pid2=0標識程序p3本身。所以輸出pid1=0,pid2=1003和pid1=0,pid2=0。

(6)執行整個結束。

根據以上分析可知答案:

1、一共執行了四個程序。(p0, p1, p2, p3)

2、另外幾個程序的輸出分別為:

pid1:1001, pid2:0

pid1:0, pid2:1003

pid1:0, pid2:0

上機測試如下:

測試結果如下:

測試結果雖然不是1001,但是可以看出理論分析過程是正確的。

題目來自:

fork 函式函式總結

學習作業系統程序時遇到用fork建立子程序,一下所寫均是個人結合網上一些資料和個人思考所得,歡迎拍磚!程序建立的原因 導致程序建立的一般有事件有 1新的批處理作業 2互動登陸 終端使用者登陸到系統 3作業系統因為提供一項服務而建立 4由現有的程序派生。注 作業系統為另乙個程序的顯示請求建立乙個程序時...

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 函式後,系統先給新的程序分配資源,例如儲存資料和 的空間。然後把原來的程序的所有...