两个子进程每个创建3个子进程

时间:2018-05-15 20:23:04

标签: linux unix process fork

我正在努力制作一个C程序,其中父进程创建了2个子进程,而这2个子进程自己创建了3个子进程。我得到了6个子童进程作为结果,但是6个中有2个是父母的孩子。我似乎无法做到这一点。 任何帮助将非常感谢!

pid_t pid[2];
pid_t pid2[3];

for (i=0;i<2;i++) {
    pid[i] = fork();
    if (pid[i] == 0) {
        break;
    }
}

if (pid[0] != 0 && pid[1] != 0) {
    // That's the father, it waits for all the childs
    printf("The parent process [pid: %d, ppid: %d]\n",getpid(),getppid());
    for(i=0;i<2;i++) {
        wait(&tmp);
    }
} else {
    printf("I'm a child process [pid: %d, ppid: %d]\n",getpid(),getppid());
    for (k=0; k<3; k++){
    pid2[k]=fork();
    if (pid2[k]==0){
    break;
    }

    }

    if (pid2[0] == 0 && pid2[1] == 0 && pid2[2] == 0){
    }
    else{
    printf("Child of child [pid: %d, ppid: %d]\n",getpid(),getppid());
    }
}

1 个答案:

答案 0 :(得分:0)

当任何k的pid2[k]为0时,它是一个孙子 因此,当所有pid2都是正面时,它只是一级孩子:

/* correct code */
    if (pid2[0] > 0 && pid2[1] > 0 && pid2[2] > 0){
       printf("I am a child with 3 children\n");
    }
    else{
       printf("Child of child [pid: %d, ppid: %d]\n",getpid(),getppid());
    }

你写的内容每个初级孩子只会发生一次:第一个孙子k=0pid2[0]==0,并且不会更新pid2[1]pid2[2],这些可以是随机的还是0,取决于你的编译器 其他大孩子将在pid2[0]中拥有他们的大哥的pid。

/* incorrect code with additional printf */
    if (pid2[0] == 0 && pid2[1] == 0 && pid2[2] == 0){
       printf("I am one of the oldest children\n");
    }
    else {
       printf("Child or Younger Child of child [pid: %d, ppid: %d]\n",getpid(),getppid());
    }

现在你应该aldo处理fork()失败的情况(pid< 0)。