我在创建此过程树时遇到了麻烦。

c - 创建一个有四个 child 的流程树-LMLPHP

这是我的代码:

#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分。

最佳答案

您的缺陷在于程序本身的逻辑。首先,您考虑使用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调用非常重要。这是因为所有进程共享相同的代码,因此,如果它们不在这些点上退出,则它们将继续运行您拥有的所有其余代码(即:孙代将运行子代代码和父代代码)。

关于c - 创建一个有四个 child 的流程树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48663589/

10-10 09:06