簡體   English   中英

當孩子們叉子時fork()如何工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM