[英]Use Fork() to create three child processes with only 2 grandchild processes
使用fork()創建子進程,我試圖制作一棵看起來像這樣的樹:
p
/ | \
p p p
/ \
p p
我有一個父級來創建三個子級進程,但是我無法讓兩個外部子級停止分叉,第二個子級只能分叉兩次。
這是我的代碼:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main ()
{
pid_t lchildpid, rchildpid,mchildpid, parentpid;
int n = 0;
lchildpid = 0;
rchildpid = 0;
mchildpid = 0;
printf("\nLvl\tProc\tParent\tChild 1\tChild 2\tChild 3\n");
printf("No.\tID\tID\tID\tID\tID\n");
while(n < 3){
if((lchildpid = fork()) == 0 || (mchildpid = fork()) == 0 || (rchildpid = fork()) == 0) {
parentpid = getppid();
n++;
continue;
}
//check for forking errors
if(lchildpid == -1 || rchildpid == -1 || mchildpid == -1)
{
perror("\n The fork failed\n");
exit(1);
}
//If current fork has two children, print complete generation to console and exit while loop
if(lchildpid && rchildpid && mchildpid ){
printf("%d\t%ld\t%ld\t%ld\t%ld\t%ld\n",n, (long)getpid(), (long)getppid(), (long)lchildpid, (long)mchildpid,(long)rchildpid);
break;
}
}
exit(0);
}
這是我的輸出:
Lvl Proc Parent Child 1 Child 2 Child 3
No. ID ID ID ID ID
0 22 7 23 24 25
1 23 1 26 28 32
1 25 1 29 31 33
1 24 1 27 30 34
我想要這個輸出:
Lvl Proc Parent Child 1 Child 2 Child 3
No. ID ID ID ID ID
0 40 7 41 42 43
1 41 40 0 0 0
1 42 40 44 45 0
1 43 40 0 0 0
您正在處理fork()
成功返回兩次的事實:一次在父進程中,一次在子進程中。 這些情況可以通過返回值來區分。 由於fork()
確實會在每個子代中返回,因此將值分配給lchildpid
, mchildpid
和rchildpid
並沒有多大意義,因為每個進程都會擁有自己的這些變量副本。 如果分叉按照您的要求工作,則其中一些副本將被初始化,而其他副本則不會。
這是可能寫產生你提出的分叉模式,通過利用的短路行為的一個表達式&&
和||
運算符,並且fork()
的返回值在父級中計算為true(即使在fork()
失敗時),在子級計算為false。 如果您需要這樣做,請三思而后行-您將解決它。 提示:根據需要使用括號,如果需要,可以在&&
和||
之間包含一個整數常量。 操作數以指示這些操作的結果。
編寫一個完成所有分叉的表達式是一個很有趣的問題。 如果你沒有這樣做,但是,那么它可能會更容易,只需使用if
或switch
語句轉移到正確的行為,為每個結果fork()
那將是在實際程序中通常如何使用fork()
更多特征。
希望對您有所幫助,但是如果您正在尋找某人為您做家庭作業,那么恐怕會讓您失望。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.