Je vois dans beaucoup de logiciels hérités et de mauvais tutoriels sur Internet qui recommandent d'utiliser exit(-1)
, return -1
ou similaire, pour représenter une «terminaison anormale». Le problème est, dans POSIX au moins, -1
n'a jamais été et n'est pas un code d'état valide. man 3 exit
illustre qui exit()
renvoie la valeur de status & 0377
au parent, ce qui signifie que -1
devient 255
. Sur les systèmes non POSIX, EXIT_FAILURE
est recommandé pour la portabilité. Mais je ne vois jamais "-1 signifie une terminaison anormale" en conjonction avec "EXIT_FAILURE peut être autre chose que 1", indiquant qu'ils croient clairement que "-1" est conventionnel même sur les systèmes non-POSIX.
Voici un exemple d'une question StackOverflow qui perpétue cela. Le logiciel "unrealircd" est également un exemple de programme utilisé exit(-1)
pour terminer le programme. En pratique, cela rend difficile l'interface avec systemd
.
D'où vient cet anti-modèle? Est-il valable dans un certain contexte?
la source
unsigned char
.char
puisque sa plage de valeurs est de -128 à 127. De plus, j'ai déjà déclaré que "-1" était converti en "255" dans le corps de ma question .Réponses:
Presque tous les ordinateurs Unix utilisent un complément à deux pour les entiers, et dans le complément à deux -1 est toujours "tous les bits 1" quelle que soit la taille du mot. Si vous voulez le code de sortie le plus grand possible quelle que soit la taille de l'état de sortie du programme, utiliser -1 et laisser la bibliothèque le tronquer commodément fait l'affaire.
C'est utile parce que lorsque les scripts ou les programmes ont plus d'un état de sortie possible (voir
grep
un exemple simple), les plus significatifs sont généralement affectés aux plus petits nombres, ce qui rend le plus grand code de sortie possible un bon à utiliser pour "erreur inconnue" ou " abandonner ", car il est peu probable qu'il entre en conflit avec une valeur de statut significative.la source
exit()
commestatus &= 0xff
. Y a-t-il une "taille de mot" qui-1 & 0xff
n'est pas 255? Bien sûr que non, car tout le but est de l'adapter à une plage de 0 à 255. Quoi qu'il en soit, votre dernière phrase n'a pas de sens: les codes d'état 128-255 ont une fonction spéciale dans les systèmes UNIX.