创建一个包含4个子项的进程树

时间:2018-02-07 12:17:03

标签: c unix fork

我在创建此流程树时遇到问题。

Process Tree

这是我的代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h> 
#include <sys/types.h>
#include <sys/wait.h>

int main ()
{
    int i;
    printf("\n [ID = %d] I am the root parent \n", getpid());
    for(i=0;i<4;i++)
    {
        pid_t ret=fork();
        if(ret <0) //eror occured
        {       
            printf("Fork Failed \n");
            return 1;
        }
        else if (ret == 0){
            printf("\n [ID =%d] My parent is [%d]\n", getpid(), getppid());
        }
        else
        {
            wait(NULL);
            exit(0);
        }
    }

    return 0;
}

这是我的输出

[ID = 4478] I am the root parent 

 [ID =4479] My parent is [4478]

 [ID =4480] My parent is [4479]

 [ID =4481] My parent is [4480]

 [ID =4482] My parent is [4481]

当我草拟它时,它只是一个链式过程树。

p
|
C1
|
C2
|
C3
|
C4

我尝试了其他的写作方法,但这就像生四个孩子一样。我在其他尝试中得到了6分。

1 个答案:

答案 0 :(得分:1)

你的缺陷是程序本身的逻辑。首先,您考虑使用4次迭代进行循环,而实际上您只需要父进程上有2个子级。但是,当fork成功(ret > 0)时,您正在调用wait(NULL); exit(0);,这将停止for循环并在wait停止挂起后退出流程。当孩子们forked时,他们也会在for循环自己。如果循环没有卡在wait(NULL); exit(0);语句中,那么你会有更大的混乱,父进程有4个孩子,而且孩子有3到0个孩子,还有孙子有2到0个孩子,等等..

你需要的是这样的东西:

for(i = 0; i < 2; ++i){
  pid_t ret = fork();

  if(ret < 0){
    printf("Fork Failed!\n");
    return 1;
  } else if(ret == 0) { //Children process
    pid_t children_ret = fork();

    if(children_ret < 0){
      printf("Fork Failed!\n");
      return 1;
    } else if(children_ret == 0) { //Grandchildren process
      //... Do whatever you want on the grandchildren process
      exit(0);
    }

    //... Do whatever you want on the children process
    wait(NULL);
    exit(0);
  }
}
//... Do whatever you want on the parent process
wait(NULL);
exit(0);

请注意,对子孙进程的exit调用非常重要。这是因为所有进程共享相同的代码,因此如果他们不退出这些代码,他们将继续运行你拥有的任何其他代码(即:孙子将运行子代码和父代码)。