Comment le processus parent obtient-il l’état de fin en attendant un processus enfant qui appelle _exit

J’ai lu la déclaration suivante.

L’argument status donné à _exit () définit le statut de fin du processus, qui est disponible pour le parent de ce processus lorsqu’il appelle wait ().

Un processus est toujours terminé avec succès par _exit () (c-à-d. Que _exit () ne retourne jamais ).

Question

Si _ exit n’est pas renvoyé, comment le processus parent peut-il obtenir l’état de fin du processus enfant via l’ attente ?

    Lorsqu’un processus se termine (en appelant ou non _exit (int Exit_Status)), le kernel envoie la fonction SIGCHLD à son parent. le parent peut soit

    1. Ignore the incoming signal 2. Catch it by installing a signal handler 

    Plus précisément, le parent peut intercepter le statut de sortie en appelant la fonction wait () ou waitpid (). Dans ce cas, le LSB est mis à la disposition du parent. Plus précisément, le statut peut être appris comme suit

      int status; wpid = waitpid(child_pid, &status, WUNTRACED); 

    Étant donné que seuls les 8 derniers bits sont disponibles, il sera logique de masquer le bit supérieur en effectuant une opération au niveau des bits et une opération avec 255. Une macro définie par le système le fait pour vous.

      WEXITSTATUS(status); 

    Ainsi, afin d’obtenir le statut d’enfant – vous pouvez utiliser après la déclaration waitpid

      printf("child exited, status=%d\n", WEXITSTATUS(status)); 

    Ignorer le SIGCHLD peut entraîner la création d’un ou plusieurs processus zombies. La définition de l’indicateur SA_NOCLDWAIT pour SIGCHLD ne produit pas de zombie, car le kernel les récupère. Cependant, le code n’est pas portable et il est préférable d’utiliser un appel système en attente.

    Lorsque l’enfant se termine, le kernel conserve des informations à ce sujet. Parmi ces informations figure le code de retour.

    Pendant ce temps, le parent n’a pas pris fin. En appelant wait ou waitpid il demande simplement au kernel “Hey, tu connais mon enfant? Quel est son statut?”.

    Dans la fonction _exit (int status), le processus informe le processus parent via SIGCHLD qu’il est sur le sharepoint se terminer et les 8 bits de poids faible de l’état sont mis à la disposition du parent. Le statut de sortie est géré de trois manières.

    1. Le processus parent peut indiquer qu’il n’est pas intéressé par la valeur de retour et, dans ce cas, le statut de sortie est ignoré et le processus enfant se termine.
    2. Le processus parent peut être dans un wait (), alors le statut est communiqué au parent et le processus enfant se termine.
    3. Le processus parent n’est pas dans wait (), puis le processus enfant se transforme en un processus zombie, dont le but est d’attendre que le parent fasse un appel à wait () pour récupérer l’état de sortie.

    _exit() ne retourne pas signifie que lorsqu’un processus appelle _exit() , cet appel ne le retourne jamais (dans ce cas, car le processus se termine).

    _exit() est un appel système et prend un argument. Le kernel enregistre cet argument dans une structure interne. Le kernel a une structure légère pour les processus qui se sont déjà terminés mais qui n’ont pas encore été attendus (zombies). Lorsqu’un processus attend ses enfants via wait() (un autre appel système), le kernel récupère cette valeur et oublie le zombie.