fork 函式簡介

2022-04-28 19:09:05 字數 3265 閱讀 1309

fork系統呼叫用於建立乙個新程序,稱為子程序,它與進行fork()呼叫的程序(父程序)併發執行。建立新的子程序後,兩個程序都將執行fork()系統呼叫之後的下一條指令。子程序使用相同的pc(程式計數器),相同的cpu暫存器,相同的開啟檔案,這些檔案在父程序中使用。

fork()
它不接受任何引數並返回乙個整數值。

下面是fork()返回的不同值。

負值:建立子程序失敗。

:返回到新建立的子程序。

正值:返回給父親或呼叫者。該值包含新建立子程序的程序id。

**以下程式的執行結果:

#include #include #include int main()

執行結果

hello world!

hello world!

計算列印hello的次數。

#include #include int main() 

執行結果

hello

hello

hello

hello

hello

hello

hello

hello

解釋

hello列印的次數等於建立的程序數。程序總數=\(2^n\),其中n是fork系統呼叫的數量。所以這裡\(n=3\),\(2^3=8\)。

讓我們為這三行新增一些標籤名稱:

fork ();   // line 1

fork (); // line 2

fork (); // line 3

// 一共 7 個子程序,它們中每乙個分別建立於這三行中的哪乙個呢?

l1 // 有 1 個程序建立於line 1 的fork() p1

/ \

l2 l2 // 有 2 個程序建立於line 2 的fork() p2~p3

/ \ / \

l3 l3 l3 l3 // 有 4 個程序建立於line 3 的fork() p4~p7

因此總共有八個程序(新子程序和乙個原始程序)。

如果我們想要將程序之間的關係表示為樹形層次結構,它將如下所示:

主要程序:p0。

第乙個分叉建立的程序:p1。

第二個分叉建立的程序:p2,p3。

第三個分叉建立的程序:p4,p5,p6,p7

p0

/ | \

p1 p4 p2

/ \ \

p3 p6 p5/p7

**以下程式的執行結果:

#include #include #include void forkexample() 

int main()

執行結果

1.

hello from child!

hello from parent!

(或者)

2.hello from parent!

hello from child!

解釋

在上面的**中,建立子程序,fork()在子程序中返回0,向父程序返回正整數。

在這裡,兩個輸出是都是有可能的,因為父程序和子程序同時執行。所以我們不知道os首先把控制權交給哪個程序父程序或子程序。

重要提示:父程序和子程序執行相同的程式,但這並不意味著它們是相同的。os為這兩個程序分配不同的資料和狀態,並且控制這些程序的流程也可以不同。請參見下乙個示例

**以下程式的執行結果:

#include #include #include void forkexample() 

int main()

執行結果

parent has x = 0

child has x = 2

(或者)

child has x = 2

parent has x = 0

解釋

這裡,乙個程序中的全域性變數變化不會影響另外兩個程序,因為兩個程序的資料/狀態不同。而且父程序和子程序同時執行,所以可以有兩個輸出。

fork系統呼叫建立乙個新程序。fork()建立的新程序是當前程序(返回值除外)的副本。exec()系統呼叫用新程式替換當前程序。

乙個程序執行以下**

for (i = 0; i < n; i++) 

fork();

建立的子程序總數為:

(a) n

(b) 2^n – 1

(c) 2^n

(d) 2^(n+1) – 1;

檢視此題答案

考慮以下**片段

if (fork() == 0)  else
設u,v是父程序列印的值,x,y是子程序列印的值。下列哪一項是正確的?

(a) u = x + 10 and v = y

(b) u = x + 10 and v != y

(c) u + 10 = x and v = y

(d) u + 10 = x and v != y

檢視此題答案

**以下程式的輸出

#include #include int main() 

檢視此題

linux環境下fork 函式簡介

fork 函式原型 pid t fork void 需要引入的標頭檔案 功能 fork函式通過系統呼叫建立乙個與原來程序幾乎完全相同的程序,並且兩個新的程序將併發執行。若fork函式成功呼叫,一次會返回兩個值,子程序返回0,父程序返回子程序id pid 若fork函式呼叫失敗,返回 1 相關函式 1...

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