On sait que fourchette() L'appel système est utilisé pour créer un nouveau processus qui devient l'enfant du processus appelant.
À la sortie, l'enfant quitte un statut de sortie qui doit être restitué au parent. Ainsi, lorsque l'enfant a terminé, cela devient un zombi .
Chaque fois que l'enfant sort ou s'arrête, le parent reçoit un SIGCHLD signal.
Le parent peut utiliser l'appel système wait() ou waitpid() ainsi que les macros WIFEXITED et WEXITSTATUS pour connaître l'état de son enfant arrêté.
(*)Appel système wait() : Il suspend l'exécution du processus appelant jusqu'à ce qu'un de ses enfants se termine.
Syntaxe de l'appel système wait() :
pid_t wait(int *status);
(*)L'appel système waitpid() : Il suspend l'exécution du processus appelant jusqu'à ce qu'un enfant spécifié par l'argument pid ait changé d'état.
Syntaxe de l'appel système waitpid() :
pid_t waitpid(pid_t pid int *status int options)
Remarque : Par défaut waitpid() n'attend que les enfants terminés mais ce comportement est modifiable via l'argument options tel que WIFEXITED WEXITSTATUS etc.
La valeur de pid peut être :
- Inférieur à -1 : signifie attendre tout processus enfant dont l'ID de groupe de processus est égal à la valeur absolue de pid.
- Égal à -1 : signifie attendre tout processus enfant.
- Égal à 0 : signifie attendre tout processus enfant dont l'ID de groupe de processus est égal à celui du processus appelant.
- Supérieur à 0 : signifie attendre le fils dont l'ID de processus est égal à la valeur du pid.
WIFEXITED et WEXITSTATUS sont deux des options qui peuvent être utilisées pour connaître le statut de sortie de l'enfant.
WIFEXITED(status) : renvoie vrai si l'enfant s'est terminé normalement.
WEXITSTATUS(status) : renvoie le statut de sortie du fils. Cette macro ne doit être utilisée que si WIFEXITED a renvoyé vrai.
Vous trouverez ci-dessous une implémentation C dans laquelle l'enfant utilise execl() fonction mais le chemin spécifié à execl() n'est pas défini.
Voyons quelle est la valeur du statut de sortie de l'enfant que le parent obtient.
// C code to find the exit status of child process #include #include #include #include #include // Driver code int main(void) { pid_t pid = fork(); if ( pid == 0 ) { /* The pathname of the file passed to execl() is not defined */ execl('/bin/sh' 'bin/sh' '-c' './nopath' NULL); } int status; waitpid(pid &status 0); if ( WIFEXITED(status) ) { int exit_status = WEXITSTATUS(status); printf('Exit status of the child was %dn' exit_status); } return 0; }
Sortir:

Note : Le code ci-dessus peut ne pas fonctionner avec le compilateur en ligne car fork() est désactivé.
Ici, l'état de sortie est 127, ce qui indique qu'il y a un problème avec le chemin ou qu'il y a une faute de frappe.
Quelques codes de statut de sortie sont répertoriés ci-dessous pour des informations supplémentaires :
- 1 : Erreurs diverses telles que « diviser par zéro » et autres opérations non autorisées.
-
2 : Mot-clé, commande ou problème d'autorisation manquant. - 126 : Problème d'autorisation ou la commande n'est pas un exécutable
- 128 : argument invalide pour quitter.
Remarque : La norme C ne définit pas la signification des codes retour. Les règles d'utilisation des codes retour varient selon les plateformes.