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

时间:2015-10-01 18:25:09

标签: c fork

使用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        

1 个答案:

答案 0 :(得分:1)

您正在处理fork()返回两次(成功时)的事实:一次在父进程中,一次在子进程中。这些情况可以通过返回值来区分。由于fork() 会在每个孩子中返回,因此将值分配给lchildpidmchildpid和{{1}是没有意义的因为每个进程都有自己的这些变量的副本。如果分叉按照您的意愿工作,那么其中一些副本将被初始化而其他副本则不会。

可以写一个表达式,通过利用rchildpid&&运算符的短路行为来生成您呈现的分叉模式||的返回值在父级中评估为true(即使fork()失败时),在子级中为false。如果你需要这样做,那就考虑一下,小提琴 - 你会把它解决掉。提示:根据需要使用括号,如果需要,可以在fork()&&个操作数中包含一个整数常量,以指示这些操作的结果。

编写一个完成所有分支的单个表达式是一个有趣的问题。但是,如果您没有 来执行此操作,那么使用||if语句分支到适当的行为可能会更容易每个switch。这更像是fork()在实际程序中的使用方式。

我希望有所帮助,但如果你正在寻找某人为你做功课,那么我担心我不得不让你失望。