Si yo fork
es un proceso hijo, y el proceso hijo sale antes de que el padre llame al waitpid
, ¿sigue siendo válida la información de estado de salida establecida en waitpid
? Si es así, ¿cuándo se vuelve inválido? es decir, cómo me aseguro de que puedo llamar al waitpid
en el pid niño y continuar obteniendo información de estado de salida válida después de un período de tiempo arbitrario, y cómo puedo "limpiar" (decirle al SO que ya no estoy interesado en el información de estado de salida para el proceso hijo terminado)?¿waitpid arroja información de estado válida para un proceso hijo que ya ha salido?
Estaba jugando con el siguiente código, y parece que la información de estado de salida es válida durante al menos unos segundos después de que el niño termine, pero no sé por cuánto tiempo o cómo informar al sistema operativo que no se llama de nuevo waitpid
:
#include <assert.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
pid_t pid = fork();
if (pid < 0) {
fprintf(stderr, "Failed to fork\n");
return EXIT_FAILURE;
}
else if (pid == 0) { // code for child process
_exit(17);
}
else { // code for parent
sleep(3);
int status;
waitpid(pid, &status, 0);
waitpid(pid, &status, 0); // call `waitpid` again just to see if the first call had an effect
assert(WIFEXITED(status));
assert(WEXITSTATUS(status) == 17);
}
return EXIT_SUCCESS;
}
De hecho, la segunda llamada 'waitpid' falló. ¡No pensé en eso! Gracias por señalar esto. –