Est-ce waitpid donne des informations d'état valide pour un processus enfant qui a déjà quitté?
Question
Si je fork
un processus enfant, et les sorties de processus enfant avant l'appel des parents waitpid
, puis est l'information d'état de sortie qui est fixée par waitpid
toujours valide? Si oui, quand devient-elle pas valable; à savoir, comment puis-je faire en sorte que je peux appeler waitpid
sur le pid des enfants et de continuer à obtenir des informations sur l'état de sortie valide après un laps de temps arbitraire, et comment puis-je « nettoyer » (dire le système d'exploitation que je ne suis plus intéressé à la informations sur l'état de sortie du processus enfant fini)?
Je jouais avec le code suivant, et il semble que les informations d'état de sortie est valide pendant au moins quelques secondes après la fin de l'enfant, mais je ne sais pas combien de temps ou comment informer le système d'exploitation que j'ai gagné « t appellerez waitpid
à nouveau:
#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;
}
La solution
Oui, waitpid
fonctionnera après que l'enfant a quitté. Le système d'exploitation gardera l'entrée d'un processus enfant dans la table de processus (y compris l'état de sortie) autour jusqu'à ce que le parent appelle waitpid
(ou une autre fonction wait
familiale) ou jusqu'à ce que les sorties de parents (à quel point l'état est recueillie par le processus de init
) . C'est ce qu'un « zombie » est. Un processus qui a quitté en est toujours résident dans la table de processus exactement cette fin
La entrée de processus dans la table devrait aller après le premier appel à waitpid
. Je soupçonne que la raison que, dans votre exemple, vous semblez être en mesure d'appeler waitpid
est deux fois simplement parce que waitpid
ne modifiera pas l'argument status
si pid
n'existe plus. Ainsi, le premier appel devrait fonctionner et remplir status
, et le second appel devrait être de retour un code d'erreur et ne pas changer status
. Vous pouvez le vérifier en examinant les valeurs de retour des appels waitpid
et / ou en utilisant deux variables status
différentes.
Autres conseils
Le système d'exploitation maintient processus terminé en tant que son parent (qui zombie d'état peut être la init
si le processus parent d'origine mis fin plus tôt) recueille que l'état de sortie avec appel système wait(2)
. Donc, la réponse est -. L'état de sortie du processus ne devient pas invalide
Oui.
De la page man :
Un enfant qui se termine, mais n'a pas été attendu devient un « zombie ». Le noyau maintient un ensemble minimal de des informations sur le processus de zombie (PID, de l'état de terminaison, des ressources informations sur l'utilisation) afin de permettre le parent d'effectuer plus tard une attente à obtenir des informations sur l'enfant.