(c язык) Почему fork () для l oop производит неожиданные процессы - PullRequest
0 голосов
/ 07 мая 2020
#include <stdio.h>
#include <sys/type.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>

int main(void)
{
    pid_t pid;
    int i;
    for(i=0; i<3; i++) {
        pid = fork();
        if(pid == -1) {
            printf("Fork Error.\n");
        } else if(pid == 0) {
            printf("I am child");
        }
    }

    if(pid != 0) {
        while((pid = waitpid(-1, NULL, 0)) > 0)
            if(errno == ECHILD)
                break;
            printf("I am parent and all children have exited.\n");
    }
    exit(0);

    return 0;
}

Результат таков:

«Я - ребенок» напечатано 7 раз: «Я - родитель, и все дочерние элементы вышли». печатается 4 раза

, и последовательность печати не фиксирована.

Я выяснил некоторые вопросы, с которыми я боролся, но некоторые нет. Итак, вот оно.

Почему «Я родитель, и все дети ушли». печатается 4 раза?

Не могли бы вы подробно объяснить?

PS. Я знаю, что sys / wait.h нужно вставить поверх кода, но мой босс не хочет, чтобы я это делал.

1 Ответ

0 голосов
/ 07 мая 2020

Вы выполняете форк внутри al oop, и в основном ваши дочерние процессы продолжают выполнять l oop, внутри которого они были запущены. Таким образом, на следующей итерации они могут достичь вилки и создать своего собственного дочернего элемента.

Если вы вставите break; сразу после printf("I am child");, выйдете из l oop, когда вы только что создали дочерний элемент, и позволив Если родитель продолжает создавать больше дочерних процессов, вы, вероятно, получите что-то более близкое к тому, что ожидали.

...