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 ().
- Quelle est la plage valide pour la valeur de retour du programme dans Linux / bash?
- PATH_MAX non déclaré lors de la compilation sur Ubuntu 10.04
- Comment comstackr le code multithread avec gcc
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.
_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.