Je dois utiliser les fonctions fork() et wait() pour terminer une assignation. Nous modélisons un comportement non-déterministe et avons besoin du programme fork() s'il y a plus d'une transition possible.fork() et wait() avec deux processus fils
Afin d'essayer de comprendre comment fonctionne la fourche et d'attendre, je viens de faire un programme simple. Je pense que je comprends maintenant comment fonctionnent les appels et que ça irait si le programme ne se ramifiait qu'une seule fois car le processus parent pouvait utiliser le statut de sortie du processus fils unique pour déterminer si le processus fils atteignait ou non l'état d'acceptation.
Comme vous pouvez le voir dans le code qui suit, je veux être capable de gérer des situations où il doit y avoir plus d'un processus fils. Mon problème est que vous semblez être en mesure de définir le statut en utilisant une seule fois la fonction _exit. Ainsi, comme dans mon exemple, le statut de sortie pour lequel le processus parent effectue des tests montre que le premier processus enfant a émis 0 comme statut de sortie, mais n'a aucune information sur le second processus enfant.
J'ai simplement essayé de ne pas exécuter _exit() sur un rejet, mais alors ce processus fils continuerait, et en fait il semblerait qu'il y ait deux processus parents.
Désolé pour la gaufre, mais je serais reconnaissant si quelqu'un pouvait me dire comment mon processus parent pourrait obtenir les informations d'état sur plus d'un processus enfant, ou je serais heureux que le processus parent remarque uniquement l'acceptation des statuts l'enfant traite, mais dans ce cas, j'aurais besoin de quitter les processus fils qui ont un statut de rejet.
Mon code de test est la suivante:
#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. Je comprends. Merci beaucoup pour votre réponse. – Joe
Merci encore pour votre temps. C'est génial. J'ai produit une version de travail mutilée après votre premier message, mais la vôtre est beaucoup plus propre. Cheers – Joe
@Joe si cette réponse vous a été la plus utile, vous devez l'accepter en cliquant sur la coche à gauche. –