使用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
答案 0 :(得分:1)
您正在处理fork()
返回两次(成功时)的事实:一次在父进程中,一次在子进程中。这些情况可以通过返回值来区分。由于fork()
会在每个孩子中返回,因此将值分配给lchildpid
,mchildpid
和{{1}是没有意义的因为每个进程都有自己的这些变量的副本。如果分叉按照您的意愿工作,那么其中一些副本将被初始化而其他副本则不会。
可以写一个表达式,通过利用rchildpid
和&&
运算符的短路行为来生成您呈现的分叉模式||
的返回值在父级中评估为true(即使fork()
失败时),在子级中为false。如果你需要这样做,那就考虑一下,小提琴 - 你会把它解决掉。提示:根据需要使用括号,如果需要,可以在fork()
和&&
个操作数中包含一个整数常量,以指示这些操作的结果。
编写一个完成所有分支的单个表达式是一个有趣的问题。但是,如果您没有 来执行此操作,那么使用||
或if
语句分支到适当的行为可能会更容易每个switch
。这更像是fork()
在实际程序中的使用方式。
我希望有所帮助,但如果你正在寻找某人为你做功课,那么我担心我不得不让你失望。