C++ c+中的嵌套fork()树+;

C++ c+中的嵌套fork()树+;,c++,loops,process,fork,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

这是我迄今为止所做的:

#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());
        }
    }
}
#包括
#包括
int main()
{
int p1,p2,p3,p4,i;
int左,leftPid;
国际权利;
左=叉();
右=叉();
对于(i=0;i这是错误的:

left=fork();
right=fork();
在完成这段代码之后,您将得到四个进程-因为每个
fork()
”进程都会立即再次fork-为什么要有三个。您需要确保检查每个fork调用的结果


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

首先要记住的是,在调用fork()时,它下面的代码将由子级和父级执行。因此,您确实需要使用fork()系统调用的返回值为这两个代码设置条件。现在,在您调用left=fork()之后,下一条语句right=fork()是由parent执行的,parent是right,但同样的语句也是由left-child执行的,您不希望这样!所以在left=fork()之后正在使用系统调用,为左子级和父级设置条件,以便它们可以执行自己相应的代码路径。代码中的另一个错误是右子级只会依次生成右子级,而不是左子级

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
        }
    }    
}
for(i=0;i0)//这是由父级执行的
{
right=fork();//父对象派生一个正确的子对象
if(right==0)//这是由右子级执行的
{
printf(“\n正确的子进程。级别:%d | myPID:%d | myParent:%d\n”,i,getpid(),getppid());
} 
else if(右>0)//由父级执行
{
printf(“\n租金处理。级别%d |我的左子女:%d |我的右子女:%d | myPID:%d\n”,i,leftPID,right,getpid());
break;//再次使用break将父项踢出,因为现在此父项没有工作要做,必须在此处使用break语句,否则父项将继续左右移动孩子的位置
}
}    
}