Форкинг процесса в C - PullRequest
       28

Форкинг процесса в C

0 голосов
/ 17 октября 2018

У меня есть этот код в процессе системного программирования, который я выполняю:

/* La fonction create_process duplique le processus appelant et retourne
   le PID du processus fils ainsi créé */
pid_t create_process(void)
{
    /* On crée une nouvelle valeur de type pid_t */
    pid_t pid;

    /* On fork() tant que l'erreur est EAGAIN */
    do {
    pid = fork();
    } while ((pid == -1) && (errno == EAGAIN));

    /* On retourne le PID du processus ainsi créé */
    return pid;
}

/* La fonction child_process effectue les actions du processus fils */
void child_process(void)
{
    printf(" We are in the son's process !\n"
       " son's pid is est %d.\n"
       " son's PPID is %d.\n", (int) getpid(), (int) getppid());
}

/* La fonction father_process effectue les actions du processus père */
void father_process(int child_pid)
{
    printf(" We are in the father process !\n"
       "  son's PID is %d.\n"
       " father's PID is %d.\n", (int) child_pid, (int) getpid());
}

int main(void)
{
    pid_t pid = create_process();

    switch (pid) {
    /* Si on a une erreur irrémédiable (ENOMEM dans notre cas) */
    case -1:
    perror("fork");
    return EXIT_FAILURE;
    break;
    /* Si on est dans le fils */
    case 0:
    child_process();
    break;
    /* Si on est dans le père */
    default:
    father_process(pid);
    break;
    }

    return EXIT_SUCCESS;
}

Вывод функции:

Мы находимся в процессе отца!PID сына 6246. PID отца 6245. Мы в процессе сына!PID сына - 6246. PPID сына - 1.

Я не понимаю, почему этот код выдает такой вывод: функция create_process разветвляет новый процесс у родителя.Итак, в родительском процессе функция create_process возвращает pid child_process, и я понимаю первую часть:

We are in the father's process!
son's PID is 6246.
father's PID is 6245.

Затем я предполагаю, что child_process выполняется, а функция create_process возвращает 0, потому что мы сейчас в child_process, и ятакже понимаю следующий вывод:

We are in the son's process!
son's PID is 6246.
son's PPID is 1.

Но я не понимаю, почему после этого выполнение прекращается ... мы все еще разветвляем дочерний процесс, верно?Поэтому я чувствую, что следует продолжать создавать новые процессы и печатать:

We are in the son's process !
son's PID is OTHER.
son's PPID is 6246.

Может кто-нибудь объяснить мне, почему этот код не продолжает создавать процессы

1 Ответ

0 голосов
/ 17 октября 2018
do {
    pid = fork();
} while ((pid == -1) && (errno == EAGAIN));

Если вызов на fork успешен, он вызывается только один раз.Таким образом, создается только один новый процесс.Затем ребенок звонит child_process, а родитель звонит father_process.После этого они оба возвращаются к функции main, где они выходят из оператора switch и возвращаются из main.

...