2015-10-01 66 views
0

使用fork()的创建子进程,我想作一棵树,看起来像这样:使用fork()创建只有2孙子三个子进程

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   
+2

你*确实知道'''是短路吗? – EOF

+1

是否需要通过单个表达式执行所有分叉? –

+0

供您参考:https://en.wikipedia.org/wiki/Short-circuit_evaluation – alk

回答

1

你正在处理的事实,fork()回报两次(成功):一旦在父进程中,并在儿童进程中一次。这些情况可以通过返回值加以区分。由于fork()确实在每个孩子中都返回,所以将值分配给lchildpidmchildpidrchildpid没有多大意义,因为每个进程都将拥有自己的这些变量的副本。如果分叉如你所愿地工作,那么其中一些副本将被初始化,而其他副本则不会被初始化。

可能写产生你提出的分叉模式,通过利用&&||运营商和事实的短路行为的一个表达式的fork()返回值的计算结果为true父母(即使当fork()失败)并在孩子中为假。如果你需要这样做,那么考虑一下,小提琴 - 你会解决它。提示:必要时使用括号,如果需要,可以在您的&&||操作数中包含一个整数常量,以指示这些操作的结果。

编写完成所有分叉的单个表达式是一个有趣的问题。但是,如果没有这样做,那么只需使用ifswitch语句分支到每个fork()的结果的适当行为可能会更容易。这将更多地表明fork()通常用于真实程序中。

我希望有帮助,但如果你正在寻找某人为你做功课,那么恐怕我会让你失望。

+0

对不起,我没有找人做我的老婆。我被给了一个关于fork()的实验,没有解释它们是如何工作的。我只被告知谷歌它,所以我一直在拼凑信息,因为我去。 –