c - 使用Fork()创建三个子进程,只有2个孙进程

标签 c fork

使用 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() 确实 在每个子进程中返回,因此将值分配给 lchildpidmchildpid< 没有多大意义rchildpid,因为每个进程都会有自己的这些变量的副本。如果 fork 按您想要的方式工作,那么其中一些副本将被初始化,而另一些则不会。

通过利用 &&|| 的短路行为,可以编写一个生成您所呈现的 fork 模式的单个表达式。 运算符,并且 fork() 的返回值在父级中计算为 true(即使 fork() 失败),在父级中计算为 false child 。如果你需要这样做,那么稍微思考一下并摆弄一下——你就会解决的。提示:根据需要使用括号,如果需要,您可以在 &&|| 操作数中包含一个整数常量来指示这些运算的结果。

编写一个表达式来完成所有 fork 是一个有趣的问题。但是,如果您没有这样做,那么使用 ifswitch 语句分支到适当的行为可能会更容易每个fork()的结果。这更符合实际程序中通常使用 fork() 的方式。

我希望这对您有所帮助,但如果您正在找人为您做作业,那么我恐怕会让您失望了。

关于c - 使用Fork()创建三个子进程,只有2个孙进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32894389/

相关文章:

c++ - linux:fork/socketpair/close 和多个子进程

C - 静态分配的字符数组的 memset 段错误

c - 存储来自/proc/<pid>/maps的记录的结构体

c - 以下情况如何避免read()挂起?

c - 为什么从管道读取时 read() 不会返回零

c - 如果 parent 打开一个文件,然后派生一个 child , child 是否可以访问打开的文件? (C 编程)

c - 矩阵段错误

将 *char 或 char 转换为位

c - c 中从地面射出的轨迹炮弹

C文件服务器和客户端卡在recv上