Мне нужно использовать функции fork() и wait() для выполнения задания. Мы моделируем недетерминированное поведение и нуждаемся в программе fork(), если существует более одного возможного перехода.
Чтобы попытаться выяснить, как работать с вилкой и ждать, я просто сделал простую программу. Я думаю, теперь я понимаю, как работают вызовы, и было бы хорошо, если бы программа только разветвлялась один раз, потому что родительский процесс мог использовать статус выхода из одного дочернего процесса, чтобы определить, достиг ли дочерний процесс в состоянии принятия или нет.
Как вы можете видеть из приведенного ниже кода, я хочу иметь возможность обрабатывать ситуации, когда должно быть несколько дочерних процессов. Моя проблема заключается в том, что вы, похоже, можете установить статус только с помощью функции _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 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;
}