[英]How many processes are created by this program, and by which processes are they created by?
我正在跟蹤該程序,並確定創建了多少個進程(假設沒有發生錯誤)。 我畫了一張圖以可視化過程。 在我的圖中,第一個fork()
創建的第一個進程包含1
,並且我有箭頭指向每個子進程,每個子進程都來自各自的父進程。 這看起來正確嗎?
碼:
1: child2 = 0;
2: child1 = fork(); // fork 1
3: if (child1 == 0)
4: {
5: child2 = fork(); // fork 2
6: }
7: fork(); // fork 3
8: if (child2 > 0)
9: {
10: fork(); // fork 4
11: }
圖形:
0
/|\
/ | \
1 3 4
/ \ \
/ \ \
2 3 4
/ /
/ /
3 4
/
/
4
合理
fork()
命令創建了子級1
。 fork()
命令僅因1
創建子2
,因為if(child1 == 0)
,即,只有fork()
向child1
返回0的進程是1
。 fork()
第7行命令創建子3
為0
, 1
,和2
,因為該語句是由每個進程執行。 fork()
第10行命令創建子4
對每一個工藝除2
,因為每個進程具有的副本child2
將其返回從正值fork()
除了2
,這將在具有0 child2
。 你怎么看? 我是否解釋了此代碼並正確繪制了圖形?
UPDATE
正確的圖形是:
0
/ \
/ \
1 3
/|\
/ | \
2 4 3
/ \
/ \
3 4
應用於示例的pstree
命令顯示:
bash-+-a.out-+-a.out-+-a.out---a.out
| |-a.out---a.out
| `-a.out
`-a.out
如下所示,每行只有一個進程。
bash-+-a.out-+---------------------
+-a.out-+-------------
| +-a.out-------
| | `-a.out
| |-a.out-------
| | `-a.out
| `-a.out-------
`-a.out---------------
分支重新排序后,它與@Macattack的答案匹配。
請注意,在上圖中您沒有有關流程創建的相對時間的信息;這只是最終結果。
為了理解該圖,讓我們看一下父進程派生后的樹:
int main(void) {
int child1 = fork();
}
結果是:
bash-+-a.out---a.out
^ parent ^child
然后,如果孩子再次分叉,
int main(void) {
int child2 = 0;
int child1 = fork();
if (child1 == 0)
child2 = fork();
}
我們得到:
bash-+-a.out---a.out---a.out
^ parent ^child ^grandchild
但是如果父母再次分叉,孩子卻不會,
int main(void) {
int child2 = 0;
int child1 = fork();
if (child1 > 0)
child2 = fork();
}
我們得到:
bash-+-a.out-+-a.out <- child1
^ `-a.out <- child2
parent
注意pstree
通過合並相同的同級來壓縮輸出。 您需要使用-c
選項來防止這種情況,並查看完整的樹。
下面是我的解釋,你可以決定是否匹配你的,我不太明白說像“創建子3
為0
, 1
,和2
”,因為每個將是一個獨立的孩子。
我的代碼副本:
int main(void) {
int child2 = 0;
int child1 = fork(); // fork 1
if (child1 == 0)
{
child2 = fork(); // fork 2
}
fork(); // fork 3
if (child2 > 0)
{
fork(); // fork 4
}
printf("%jd\n", getpid());
}
圖:(左父,右子)
|
|\_____ // fork 1
| |
| |\______ // fork 2
| | |
|\__ |\__ |\__ // fork 3
| | | | | |
| | |\ |\ | | // fork 4
| | | | | | | |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.