嵌套的fork()树在c ++中

时间:2016-02-29 14:53:23

标签: c++ loops process fork

这是我做过的事情:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int p1,p2,p3,p4,i;
    int left,leftPid;
    int right;  
    left=fork();
    right=fork();
    for(i=0;i<=2;i++)
    {
        if(left==0)
            printf("\nleft Child Process. Level: %d | myPID: %d | myParent: %d\n",i,getpid(),getppid());    
        else
            leftPID=left;
        if (right==0)
        {
            printf("\nright Child Process. Level: %d | myPID: %d | myParent: %d\n",i,getpid(),getppid());
            right=fork();
        }
        else
        {
            printf("\nParent Process. Level %d | My left Child: %d | My right Child: %d | myPID: %d\n",i,leftPID,right,getpid());
        }
    }
}

我需要那种输出:

  
    

左子进程。等级:1 | myPID:23560 | myParent:23559

         

父流程。等级:0 |我的左孩子:23560 |我的右孩子:23561 | myPID:23559

         

左子进程。等级:2 | myPID:23562 | myParent:23561

         

左子进程。等级:3 | myPID:23564 | myParent:23563

         

正确的儿童过程。等级:3 | myPID:23565 | myParent:23563

         

父流程。等级:2 |我的左孩子:23564 |我的右孩子:23565 | myPID:23564

         

父流程。等级:1 |我的左孩子:23562 |我的右孩子:23563 | myPID:23561

  

这是一个树形表示我需要的东西:

fork() tree

我所做的代码远非我所需要的。我希望有人可以帮助我。

2 个答案:

答案 0 :(得分:1)

这是错误的:

left=fork();
right=fork();

在此代码之后,您最终会得到四个进程 - 因为每个fork()进程都会立即再次进行分析 - 为什么要有三个进程。您需要确保检查每次分叉调用的结果。

考虑到这一点,您可以重新编写其他代码。

答案 1 :(得分:0)

要记住的第一件事是,当调用fork()时,它下面的代码由child和parent执行。所以你需要通过使用fork()系统调用的返回值来为它们设置条件。在你的情况下,在调用left = fork()之后,右边的下一个语句= fork()由父项执行,这是对的,但同样的声明也由左孩子执行,你不想要那个!所以在使用left = fork()系统调用之后,为left child和parent设置条件,以便它们可以执行自己相应的代码路径。你的代码中的另一个错误是,正确的孩子只会依次生成一个正确的孩子而不是它的左孩子。

for(i=0;i<=2;i++)
{
    left=fork();
    leftPID=left; 

    if(left==0) //use break statement for left child since we want it to be kicked out and not execute anything!
    {
        printf("\nleft Child Process. Level: %d | myPID: %d | myParent:                      %d\n",i,getpid(),getppid())
        break; // break statement has to used here necessarily or else left child  will keep on making left childs
    }         
    else if(left>0) //this is executed by parent
    {
        right=fork(); //parent forks a right child

        if (right==0) //this is executed by right child
        {
            printf("\nright Child Process. Level: %d | myPID: %d | myParent:                      %d\n",i,getpid(),getppid());
        } 
        else if(right>0) //executed by parent
        {
            printf("\nParent Process. Level %d | My left Child: %d | My right Child: %d | myPID: %d\n",i,leftPID,right,getpid());
            break; //again use break to kick out parent since now this parent has no work to do and break statement has to used here necessarily or else parent will keep on making childs-left and right
        }
    }    
}