Два дочерних процесса создают 3 дочерних процесса каждый - PullRequest
0 голосов
/ 15 мая 2018

Я борюсь за создание программы на C, где родительский процесс создает 2 дочерних процесса, а эти 2 дочерних процесса создают 3 дочерних процесса самостоятельно.В качестве результата я получаю 6 дочерних процессов, но 2 из 6 - дочерние от родителя.Я не могу заставить это работать.Любая помощь будет принята с благодарностью!

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 голосов
/ 16 мая 2018

Когда pid2[k] равен 0 для любого k, это внук.
Так что это только дочерний элемент первого уровня, когда все 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=0 будет иметь pid2[0]==0 и не будет обновлять pid2[1] и pid2[2], они могут быть случайными или 0, в зависимости от вашего компилятор.
У других внуков будет пид их старшего брата в pid2[0].

/* 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());
    }

Теперь вы должны также обрабатывать ситуации, когда fork() не срабатывает (pid< 0).

...