Мне нужно использовать функции 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;
}