Ho bisogno di utilizzare le funzioni fork() e wait() per completare un compito. Stiamo modellando un comportamento non deterministico e abbiamo bisogno che il programma si biforchi() se c'è più di una possibile transizione.fork() e wait() con due processi figlio
Per cercare di capire come funziona la forchetta e attendere, ho appena creato un programma semplice. Penso di capire ora come funzionano le chiamate e andrebbe bene se il programma si diramasse solo una volta perché il processo genitore potrebbe utilizzare lo stato di uscita dal processo figlio singolo per determinare se il processo figlio ha raggiunto o meno lo stato di accettazione.
Come si può vedere dal codice che segue, tuttavia, voglio essere in grado di gestire le situazioni in cui devono essere presenti più processi figlio. Il mio problema è che sembra che tu sia in grado di impostare lo stato solo usando una funzione _exit una volta. Pertanto, come nel mio esempio, lo stato di uscita verificato dal processo padre per indica che il primo processo figlio ha emesso 0 come stato di uscita, ma non ha informazioni sul secondo processo figlio.
Ho provato semplicemente non _exit() - su un rifiuto, ma poi quel processo figlio avrebbe continuato, e in effetti sembrerebbe che ci siano due processi genitore.
Ci scusiamo per la chiacchiera, ma sarei grato se qualcuno potesse dirmi come il mio processo genitore potrebbe ottenere le informazioni sullo stato su più di un processo figlio, o sarei felice per il processo genitore di notare solo accettare lo stato da il bambino elabora, ma in tal caso dovrei uscire con successo dai processi figli che hanno uno stato di rifiuto.
mio codice di prova è la seguente:
#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;
}
Ok. Capisco. La ringrazio molto per la risposta. – Joe
Grazie ancora per il tuo tempo. È fantastico. Ho prodotto una mia versione di lavoro alterata dopo il tuo post iniziale, ma la tua è molto più ordinata. Saluti – Joe
@Giuttosto se questa risposta ti è stata di grande aiuto, dovresti accettarla facendo clic sul segno di spunta a sinistra. –