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