Захват кода завершения n дочерних процессов - PullRequest
1 голос
/ 08 марта 2020

Я пытаюсь fork () 10 дочерних процессов в одном l oop, а затем в другом l oop wait () для их завершения и печати их PID вместе с их кодом состояния выхода . Это не может быть сделано любым другим способом или с использованием любой другой функции. Две петли / волны и функция wait (); Вот что я попробовал:

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    pid_t wait_p, p[10], p_child;
    int status;
    for (int i = 0; i < 10; i++)
    {
        p[i] = fork();
    }

    for (int i = 0; i < 10; i++)
    {
        switch (p[i])
        {
        case 0:
            p_child = getpid();
            exit(p_child % 10);
            break;
        case -1:
            puts("ERROR");
            break;
        default:
            wait_p = wait(&status);
            printf("Child with PID: %d", wait_p);
            if (WIFEXITED(status))
                printf(" terminated with STATUS: %d\n", WEXITSTATUS(status));
            break;
        }
    }

    return (EXIT_FAILURE);
}

Этот код будет выполнять бесконечное число дочерних процессов. На нем должен быть напечатан только первый оригинал (выданный THE одним из родителей) 10. Что я делаю не так?

1 Ответ

1 голос
/ 08 марта 2020

Вы должны обрабатывать дочерние процессы непосредственно в первом l oop:

for (int i = 0; i < 10; i++)
{
    p[i] = fork();
    if (p[i] == 0) {
        p_child = getpid();
        exit(p_child % 10);
    } else if (p[i] == -1) {
            perror("fork");
    }        
}

, а затем ждать их во втором l oop

for (int i = 0; i < 10; i++)
{       
        wait_p = wait(&status);
        printf("Child with PID: %d", wait_p);
        if (WIFEXITED(status))
                printf(" terminated with STATUS: %d\n", WEXITSTATUS(status));
}

You не может обработать случай, который fork() возвращает в дочернем процессе (с 0 в качестве возвращаемого значения), во втором l oop, в противном случае каждый дочерний процесс в первом l oop продолжает разветвлять больше дочерних процессов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...