fork () в цикле For - PullRequest
       39

fork () в цикле For

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 раза

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

Вот мой вопрос!

Почему «Я ребенок» печатается 7 раз,

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

Я не понимаю, сколько раз напечатаны эти предложения.

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

1 Ответ

1 голос
/ 07 мая 2020

Вы можете попробовать приведенный ниже код. Вам нужно добавить заголовок ожидания. В то же время, указав для дочерних процессов условие 0, вы обязательно должны выйти из системы, иначе каждый процесс будет разветвляться снова и снова каждый раз в коде. Вскоре вы должны убить каждый процесс после завершения их задачи.

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.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\n");
            exit(0); // !
        }
    }

    if (pid != 0) {

        while ((pid = waitpid(-1, NULL, 0)) > 0)
            if (errno == ECHILD)
                break;

        printf("I am parent and all children have exited.\n");
    }

    return 0;
}
...