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