使用 fork() 创建子进程,我正在尝试制作一棵如下所示的树:
p
/ | \
p p p
/ \
p p
我让父进程创建三个子进程,但我无法让两个外部子进程停止 fork ,而第二个子进程仅 fork 两次。
这是我的代码:
#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 按您想要的方式工作,那么其中一些副本将被初始化,而另一些则不会。
通过利用 &&
和 || 的短路行为,可以编写一个生成您所呈现的 fork 模式的单个表达式。
运算符,并且 fork()
的返回值在父级中计算为 true(即使 fork()
失败),在父级中计算为 false child 。如果你需要这样做,那么稍微思考一下并摆弄一下——你就会解决的。提示:根据需要使用括号,如果需要,您可以在 &&
和 ||
操作数中包含一个整数常量来指示这些运算的结果。
编写一个表达式来完成所有 fork 是一个有趣的问题。但是,如果您没有这样做,那么使用 if
或 switch
语句分支到适当的行为可能会更容易每个fork()
的结果。这更符合实际程序中通常使用 fork()
的方式。
我希望这对您有所帮助,但如果您正在找人为您做作业,那么我恐怕会让您失望了。
关于c - 使用Fork()创建三个子进程,只有2个孙进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32894389/