Трябва да използвам функциите 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;
}