Lors de l'exécution d'un programme informatique, le système d'exploitation crée une entité abstraite appelée processus , qui gère l'exécution de ce programme. Dans les systèmes d'exploitation multitâches tels qu'Unix ou Linux , de nouveaux processus peuvent être créés par des processus actifs. Le processus qui en crée un autre est appelé processus parent , et les processus créés sont des processus enfants . Les processus enfants s'exécutent simultanément avec le processus parent. La technique de création de processus enfants permet de déléguer certaines tâches à un processus enfant lorsqu'il n'y a aucune raison d'interrompre l'exécution du processus parent. Une fois son exécution terminée, le processus enfant se termine en appelant la fonction système `exit` . Cet appel système permet de transmettre le code de retour au processus parent, qui peut le récupérer grâce à la fonction système ` wait` .
signal) .L'ensemble spécifique de codes renvoyés est propre au programme qui le génère. Il indique généralement la réussite ou l'échec. La valeur du code renvoyé par la fonction ou le programme peut indiquer une cause précise de l'échec. Sur de nombreux systèmes, plus la valeur est élevée, plus la cause de l'erreur est grave. Il est également possible que chaque bit indique une condition différente ; ces conditions sont alors évaluées conjointement par l' opérateur OU pour donner la valeur finale ; c'est le cas, par exemple, de la fonction fsck .
Parfois, si les codes sont conçus dans ce but, ils peuvent être utilisés directement comme index de branche lors du retour au programme initial afin d'éviter des tests supplémentaires.
AmigaOS
Dans AmigaOS , MorphOS et AROS , quatre niveaux sont définis :
- OK 0
- Les scripts shell exécutent généralement des commandes et enregistrent leurs codes de sortie.
Pour le fonctionnement du shell, une commande qui se termine avec un code de sortie nul est considérée comme réussie. Un code de sortie différent de zéro indique un échec. Ce système, qui peut paraître contre-intuitif, permet de définir clairement la réussite et de proposer différentes manières d'indiquer les divers modes d'échec. Lorsqu'une commande est terminée par un signal dont le numéro est N
C et C++ permettent aux programmes de signaler leur succès ou leur échec en quittant la fonction principale, soit en renvoyant un entier, soit les macrosEXIT_SUCCESS`stop` et ` exit`EXIT_FAILURE. Sur les systèmes de type Unix, ces macros sont respectivement égales à `stop`0et `exit`1. Un programme AC peut également utiliser laexit()fonction `stop` en spécifiant l'entier `status` ou la macro `exit` comme premier paramètre, ce qui interrompt l'exécution du programme.La valeur de retour de
mainest transmise à laexitfonction, qui pour les valeurs zéro,EXIT_SUCCESSouEXIT_FAILUREpeut la traduire en « une forme définie par l'implémentation » de terminaison réussie ou de terminaison infructueuse .C# , laMain()méthode ne renvoie généralement pas de type (son type est `T`void, ou `Object` sicode de sortie entier renvoyé par un programme exécutable ou une sous-routine . Les niveaux d'erreur sont généralement compris entre 0 et 255. Sous DOS, seuls 256 codes d'erreur sont disponibles, mais DR-DOS 6.0 et versions ultérieures prennent en charge les codes d'erreur 16 bits, au moins dans CONFIG.SYS . Avec 4DOS et DR-DOS COMMAND.COM , les codes de sortie (dans les traitements par lots) peuvent être définis par EXIT n et (dans CONFIG.SYS ) par ERROR= n .
Les codes de sortie sont souvent capturés par les programmes batch via les commandes IF ERRORLEVEL . Le DOS multi-utilisateur prend en charge une variable d'environnement réservée %ERRORLVL% qui est automatiquement mise à jour au retour des applications. COMMAND.COM sous DR-DOS 7.02 et versions ultérieures prend en charge une pseudo-variable d'environnement similaire , %ERRORLVL% , ainsi que %ERRORLEVEL% . Dans CONFIG.SYS , DR- DOS 6.0 et versions ultérieures prend en charge ONERROR pour tester l'état de chargement et le code de retour des pilotes de périphériques, ainsi que le code de sortie des programmes. Java , la fonction ` main()return` n'indique pas de code de sortie. Par conséquent, si nécessaire, un code de sortie est spécifié manuellement via `return` java.lang.System::exit(), ce qui met fin au programme et à la JVM. Toute méthode peut appeler `return` System.exit(), sauf si un gestionnaire de sécurité l'interdit. L'argument `status` sert de code d'état ; par convention, un code d'état différent de zéro indique une terminaison anormale.
OpenVMS
Dans OpenVMS , les valeurs impaires indiquent le succès et les valeurs paires l'échec. La valeur est un entier 32 bits comportant des sous-champs : bits de contrôle, numéro de service, numéro de message et niveau de gravité. Les niveaux de gravité sont répartis entre succès (Succès, Information) et échec (Avertissement, Erreur, Fatal).
Plan 9
Dans le C de Plan 9, le statut de sortie est indiqué par une chaîne de caractères passée à la fonction exits() , et la fonction main() est de type void .Unix et autres systèmes compatibles POSIX , le processus parent peut récupérer le statut de sortie d'un processus enfant en utilisant la wait()famille d'appels système définis dans l'en-tête POSIXchamp de bits contenant diverses informations de terminaison des processus enfants. Si le processus enfant s'est terminé par une sortie (telle que déterminée par la macro `is`, l'autre possibilité étant une sortie suite à un signal non intercepté ), `is` spécifie que les 8 bits de poids faible de l'état de sortie peuvent être récupérés à partir de la valeur d'état à l'aide de la macro `is`.waitpid()intWIFEXITED()WEXITSTATUS()
Dans l' waitid()appel système (ajouté avec SUSv1), l'état de sortie enfant et d'autres informations ne sont plus dans un champ de bits mais dans la structure de type siginfo_t.
Les systèmes compatibles POSIX utilisent généralement la convention suivante : zéro pour le succès et une valeur différente de zéro pour l’erreur. Certaines conventions se sont développées concernant la signification relative des différents codes d’erreur ; par exemple, GNU recommande de réserver les codes dont le bit de poids fort est activé aux erreurs graves.
Les systèmes d'exploitation dérivés de BSD ont défini un ensemble étendu d'interprétations privilégiées : la signification des 15 codes d'état 64 à 78 est définie dans l'en-tête POSIX sendmail et d'autres agents de transfert de messages , mais ils sont désormais utilisés dans de nombreux autres programmes. Leur utilisation est déconseillée.
Le guide de programmation Bash avancée contient des informations sur la signification des codes d'état de sortie autres que 0.
Rouiller
En Rust , main()peut retourner n'importe quel type qui implémente le trait std::process::Termination.
En interne, au niveau de l'environnement d'exécution Rust, ces fonctions renverront une valeur libc::EXIT_SUCCESSen cas de succès et libc::EXIT_FAILUREen cas d'échec.
Dans la bibliothèque standard Rust, les types suivants possèdent des implémentations pourstd::process::Termination :
!(le type jamais )()(le type d'unité )std::convert::Infalliablestd::process::ExitCode(avec des constantesSUCCESSetFAIL)std::result::Result<T, E>
VM/CMS
| Code de retour | Signification |
|---|---|
| 0 | Réussite |
| 1 | Avertissement mineur ou condition d'information |
| 2 | Avertissement, mais la commande est terminée. |
| 4 | Erreur mineure, la commande s'est terminée avec des problèmes. |
| 8 | Une erreur s'est produite. |
| 12 | Erreur grave |
| 16 | Erreur grave / la commande a échoué |
| 20+ | Erreurs graves spécifiques à la commande |
Windows
Microsoft Windows utilise des entiers non signés de 32 bits comme codes de sortie, bien que l'interpréteur de commandes les traite comme signés.
Les codes de sortie sont directement référencés, par exemple, par l'interpréteur de commandes CMD.exe, selon la errorlevelterminologie héritée de DOS . Les processus du framework .NET et Windows PowerShell y font référence en tant que ExitCodepropriété de l' Processobjet.