Pourquoi est-ce que j'obtiens l'erreur 255 en retournant -1

10

Je suis nouveau dans la programmation C ++ et j'ai une question très basique. J'ai remarqué que lorsque je reviens -1dans le programme C ++, puis vérifie l'état de sortie, j'obtiens 255. Pourquoi donc?

Le code est le plus basique:

int main()
    {
        return -1;
    }

Ensuite, après avoir exécuté le code compilé:

echo $?
255
Eugene S
la source

Réponses:

24

Parce que sous UNIX / POSIX, le code de sortie d'un programme est défini comme une valeur 8 bits non signée. La conversion de -1 en 8 bits non signé donne 255.

Modifier pour ajouter:

Pour donner plus de détails: la famille wait * () des appels système sous UNIX code le résultat d'un processus en un seul entier 32 bits. Les 32 bits de ce résultat sont ensuite décomposés pour fournir des informations telles que la fin du processus de vidage du noyau en raison d'un 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 d'UNIX / POSIX est l'une de ses fonctionnalités les plus anciennes et les plus profondément intégrées; si vous étiez en train de concevoir un nouveau système d'exploitation aujourd'hui, vous pourriez faire quelque chose de différent (au moins utiliser 64 bits :-)).

D'un autre côté, en pratique, est-il vraiment utile d'avoir> 255 codes de sortie? J'en doute. Si vous vouliez vraiment quelque chose de plus puissant, je vous suggère de passer à une "chaîne de sortie", au lieu d'un code de sortie numérique avec une plage plus large.

Scientifique fou
la source
Joli montage. Merci pour ces informations supplémentaires.
George M
7

Pour citer une bashpage de manuel sur EXIT STATUS

Le statut de sortie d'une commande exécutée est la valeur renvoyée par l'appel système waitpid ou une fonction équivalente. Les états de sortie se situent entre 0 et 255, cependant, comme expliqué ci-dessous, le shell peut utiliser des valeurs supérieures à 125 spécialement. Les états 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 de défaillance spécifiques.

Donc, cela limite cette plage, je suis en fait aussi surpris que vous.

Depuis la waitpid (2)page de manuel:

WEXITSTATUS(status)

renvoie l'état de sortie de l'enfant. Il s'agit des 8 bits les moins significatifs de l'argument de statut spécifié par l'enfant dans un appel à exit (3) ou _exit (2) ou comme argument pour une instruction de retour dans main (). Cette macro ne doit être utilisée que si WIFEXITED a renvoyé true.

utopiabound
la source