Pourquoi jobtiens lerreur 255 en renvoyant -1
On février 17, 2021 by admin Je suis nouveau dans la programmation C ++ et jai une question très basique. Jai remarqué que lorsque je retourne -1
dans le programme C ++ puis vérifie létat de sortie, jobtiens 255
. Pourquoi?
Le code est le plus basique:
int main() { return -1; }
Ensuite, après avoir exécuté le code compilé:
echo $? 255
Réponse
Parce que sous UNIX / POSIX, le code de sortie dun programme est défini comme étant une valeur 8 bits non signée. La conversion de -1 en 8 bits non signés donne 255.
Modifier pour ajouter:
Pour donner plus de détails: la famille des appels système wait * () sous UNIX encode le résultat dun processus en un seul entier 32 bits. Les 32 bits de ce résultat sont en outre fractionnés pour fournir des informations telles que si le processus a vidé le cœur, est sorti en raison dun signal (et lequel), etc. Sur ces 32 bits, seuls 8 sont réservés pour le code de sortie du processus et ceux-ci sont interprétés comme une valeur non signée.
Le modèle fork / exec / wait dUNIX / POSIX est lune de ses fonctionnalités les plus anciennes et les plus profondément intégrées; si vous conceviez un nouveau système dexploitation aujourdhui, vous pourriez faire quelque chose de différent (au moins utiliser 64 bits :-)).
Dun autre côté, est-ce vraiment utile en pratique davoir plus de 255 codes de sortie? Jen doute. Si vous voulez vraiment quelque chose de plus puissant, je vous suggère de passer à une « chaîne de sortie », au lieu dun code de sortie numérique avec une plage plus large.
Commentaires
- Belle modification. Merci pour ces informations supplémentaires.
Réponse
Pour citer bash
page de manuel sur EXIT STATUS
Létat de sortie dune commande exécutée est la valeur renvoyée par lappel système waitpid ou une fonction équivalente. Les statuts de sortie sont compris entre 0 et 255, bien que, comme expliqué ci-dessous, le shell peut utiliser des valeurs supérieures à 125 spécialement. Les statuts de sortie des commandes internes du shell et des commandes composées sont également limités à cette plage. Dans certaines circonstances, le shell utilisera des valeurs spéciales pour indiquer des modes déchec spécifiques.
Donc, il limite cette plage, je suis en fait aussi surpris que vous lêtes.
Depuis la page de manuel waitpid (2)
:
WEXITSTATUS(status)
renvoie létat de sortie de lenfant. Il se compose des 8 bits les moins significatifs de largument détat que lenfant a spécifié dans un appel à exit (3) ou _exit ( 2) ou comme argument pour une instruction return dans main (). Cette macro ne doit être utilisée que si WIFEXITED renvoie true.
Laisser un commentaire