Necesito usar las funciones fork() y wait() para completar una tarea. Estamos modelando comportamientos no deterministas y necesitamos que el programa se bifurque() si hay más de una transición posible.fork() y wait() con dos procesos secundarios
Para intentar averiguar cómo funciona el fork y esperar, acabo de hacer un programa simple. Creo que ahora entiendo cómo funcionan las llamadas y estaría bien si el programa solo se bifurcara una vez porque el proceso principal podría usar el estado de salida del proceso hijo único para determinar si el proceso secundario alcanzó el estado de aceptación o no.
Como puede ver en el código que sigue, quiero ser capaz de manejar situaciones donde debe haber más de un proceso secundario. Mi problema es que parece que solo puede establecer el estado usando una función _exit una vez. Entonces, como en mi ejemplo, el estado de salida que el proceso principal prueba muestra que el primer proceso hijo emitió 0 como estado de salida, pero no tiene información sobre el segundo proceso secundario.
Probé simplemente no _exit() - en un rechazo, pero luego ese proceso hijo continuaría, y en efecto parece que hay dos procesos principales.
Disculpe por el gofre, pero le agradecería a alguien que me dijera cómo el proceso de mis padres podría obtener la información de estado en más de un proceso secundario, o me alegra que el proceso solo advierta aceptar estado de el niño procesa, pero en ese caso tendría que salir exitosamente de los procesos secundarios que tienen un estado de rechazo.
Mi código de prueba es el siguiente:
#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. Entiendo. Muchas gracias por su respuesta. – Joe
Gracias de nuevo por su tiempo. Eso es genial. Produje una versión de trabajo destrozada después de tu publicación inicial, pero la tuya es mucho más ordenada. Saludos – Joe
@Joe si esta respuesta fue la más útil para usted, entonces debe aceptarla haciendo clic en la marca de verificación a la izquierda. –