fork () и wait () с двумя дочерними процессами

Мне нужно использовать функции fork () и wait () для выполнения назначения. Мы моделируем недетерминированное поведение и нам нужна программа для fork (), если существует более одного возможного перехода.

Чтобы попытаться понять, как работают fork и wait, я просто создал простую программу. Я думаю, что теперь понимаю, как работают вызовы, и было бы хорошо, если бы программа разветвлялась только один раз, потому что родительский процесс мог использовать состояние выхода из одного дочернего процесса, чтобы определить, достиг ли дочерний процесс состояния принятия или нет.

Как видно из следующего кода, я хочу иметь возможность обрабатывать ситуации, когда должно быть более одного дочернего процесса. Моя проблема в том, что вы, похоже, можете установить статус, используя функцию _exit только один раз. Итак, как и в моем примере, состояние выхода, которое проверяет родительский процесс, показывает, что первый дочерний процесс выдал 0 в качестве состояния выхода, но не имеет информации о втором дочернем процессе.

Я просто попытался не _exit () - при отклонении, но потом этот дочерний процесс продолжится, и в действительности, похоже, будут два родительских процесса.

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

Мой тестовый код выглядит следующим образом:

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

int main(void)  {

    pid_t child_pid, wpid, pid;
    int status = 0;
    int i;

    int a[3] = {1, 2, 1};
    for(i = 1; i < 3; i++)  {
        printf("i = %d\n", i);
        pid = getpid();
        printf("pid after i = %d\n", pid);
        if((child_pid = fork()) == 0)  {
            printf("In child process\n");
            pid = getpid();
            printf("pid in child process is %d\n", pid);
            /* Is a child process */
            if(a[i] < 2)  {
                printf("Should be accept\n");
                _exit(1);
            } else  {
                printf("Should be reject\n");
                _exit(0);
            }
        }
    }

    if(child_pid > 0)  {
        /* Is the parent process */
        pid = getpid();
        printf("parent_pid = %d\n", pid);
        wpid = wait(&status);
        if(wpid != -1)  {
            printf("Child's exit status was %d\n", status);
            if(status > 0)  {
                printf("Accept\n");
            } else  {
                printf("Complete parent process\n");
                if(a[0] < 2)  {
                    printf("Accept\n");
                } else  {
                    printf("Reject\n");
                }
            }
        }
    }
    return 0;
}

Ответы на вопрос(3)

Ваш ответ на вопрос