Je vois dans de nombreux logiciels hérités et de mauvais tutoriels sur Internet qui recommandent d'utiliser exit(-1)
, return -1
Ou similaire pour représenter une "fin anormale". Le problème est que, dans POSIX au moins, -1
N'a jamais été et n'est pas un code d'état valide. man 3 exit
Illustre que 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 de question StackOverflow qui perpétue cela. Le logiciel "unrealircd" est également un exemple de programme qui utilise 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?
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 statut de sortie possible (voir grep
pour un exemple simple), les plus significatifs sont généralement attribués aux plus petits nombres, ce qui rend le plus grand code de sortie possible un bon à utiliser pour "erreur inconnue" ou "abandon" car il est peu probable qu'il entre en conflit avec une valeur d'état significative.