Est-ce waitpid donne des informations d'état valide pour un processus enfant qui a déjà quitté?

StackOverflow https://stackoverflow.com/questions/2865640

  •  30-09-2019
  •  | 
  •  

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;
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top