[英]How is fork() working when children fork?
我已經執行了一段代碼。 它如下所示:
#include<stdio.h>
main() {
int i=0;
fork();
printf("The value of i is:%d\n",++i);
fork();
printf("The value of j is:%d\n",++i);
fork();
wait();
}
我得到以下輸出:
The value of i is:1
The value of j is:2
The value of i is:1
The value of j is:2
The value of j is:2
pckoders@ubuntu:~$ The value of j is:2
任何人都可以向我解釋fork()和wait()函數在這里扮演什么角色?
fork()
調用是字面上的fork。 完成后,您將擁有2個具有精確堆棧的精確進程,並且所有描述符都指向相同的對象。 您可以通過返回值區分它們。 對於子進程, fork()
返回0,表示父子進程id。
所以
main() {
int i=0;
fork();
// at this point you are having 2 processes. stdout and stdin are basically just dupplicates.
// (P)
// / \
// (P) (C)
// prints1 prints 1
printf("The value of i is:%d\n",++i); // so 2 processes with print 1
fork();
// now you are having 4 processes( both parent and children forked)
// (P)
// / \
// / \
// (P) (C)
// / \ / \
// (PP) (PC) (CP) (CC)
// prints 2 prints 2 prints 2 prints 2
printf("The value of j is:%d\n",++i);
fork();
// now 4 processes are forking. now you have 8 processes
// (P)
// / \
// / \
// / \
// (P) (C)
// / \ / \
// / \ / \
// (PP) (PC) (CP) (CC)
// / \ / \ / \ / \
// (PPP) (PPC) (PCP) (PCC) (CPP) (CPC) (CCP) (CCC)
wait();
}
該程序生成一個進程樹。 在每個fork
,這棵樹分成兩半。 如果你拿一張紙,畫這棵樹並不是很難; 唯一困難的是由於你使用前綴++
而使i
值正確。 如果讓每個進程在最后都sleep
幾秒鍾,您還可以使用pstree
程序觀察樹。
然后,每個進程都運行wait
系統調用,該調用等待其任何一個子進程 (進程樹中的子節點)完成。
在第一個fork()之后有兩個進程(當前和它的精確副本,子進程),它們都打印1。
這兩個進程中的每一個都使用第二個fork()調用重復自身,並且有4個進程,每個進程打印2個。
它們的輸出是隨機順序的,因為它始終與並行執行有關。
Forking進程以樹狀方式創建Children。將每個fork作為二叉樹的不同層。當你不發出fork()時,你有一個只有一個根節點的進程樹。當你發出一個fork時()然后你有一個二級樹現在有兩個級別,第一級將包含父進程,第二級將包含兩個進程 - 父進程和子進程。
當你想要找出你手頭的進程數時,只需繼續構建二進制/進程樹並查看最后一級有多少個節點,最后一級只是進程/樹的當前狀態。等等函數使你的父進程等待子進程完成執行。在你不想要僵屍進程的應用程序中你需要發出一個等待,否則這些僵屍進程將繼續占用系統... 鏈接 。
請記住,當您始終希望父級在子級之后完成時,等待也很有用。 分叉並不總是給出相同的輸出,順序是混亂的,因此總是得到相同的輸出,使用wait()。 要等待特定子進程,請使用wait(pid),其中pid是特定子進程的pid,並且可以通過子進程空間內的getpid獲取該pid。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.