Родительский и несколько дочерних PID. Форк и ожидание - функции

У меня проблемы с функциями fork/waitpid.

Я пытаюсь сделать программу, которая сначала обрабатывает и печатает дочерние PIDS, а затем родительский PID.

Мой код:

int main(void)
{
    pid_t pid;
    int rv = 0;
    int i = 1;
    pid_t child_pids[2];

    for (i = 0; i < 2; i++)
    {

        switch (pid = fork())
        {
        case -1:
            perror("fork");
            exit(1);

        case 0:
            pid = getpid();
            exit(i);
            break;

        default:
            child_pids[i] = pid;
            break;
        }
    }
    if (pid != 0 && pid != -1) {
        for (i = 0; i<2; i++){
            int status = 0;
            printf("PARENT: waiting for child %d (%d)\n", i, child_pids[i]);
            rv = waitpid(child_pids[i], &status, 0);
            printf("Child: %d, Here!!!\n", i);

        }
        printf("parent pid = %d\n", getpid());

    }
}

В настоящее время сначала создается родитель, а затем дети. Итак, у кого-нибудь есть советы, что делать?


person Tanhua    schedule 11.02.2015    source источник
comment
Что вы подразумеваете под созданием родителя в первую очередь? Родительский процесс — это запущенный процесс, он должен существовать для создания дочерних процессов. Не могли бы вы включить свой вывод?   -  person Daniel Kleinstein    schedule 11.02.2015


Ответы (1)


Из справочной страницы waitpid(2):

Значение pid может быть: [...] -1, что означает ожидание любого дочернего процесса.

и

waitpid(): в случае успеха возвращает идентификатор дочернего процесса, состояние которого изменилось; [...]

Это означает, что вы можете просто зациклить waitpid в конце вашего основного кода, например:

#define FORKED_CHILDREN 2

if (pid != 0 && pid != -1) {
    for (int collected = 0; collected < FORKED_CHILDREN; ++collected) {
        pid_t cpid = waitpid(-1, NULL, 0);
        printf("Child pid: %d\n", cpid);
    }
    printf("parent pid = %d\n", getpid());
}
person Snaipe    schedule 11.02.2015