Ich sehe in vielen älteren Programmen und schlechten Tutorials im Internet, dass die Verwendung von oder ähnlichem empfohlen wird exit(-1)
, return -1
um eine "abnormale Beendigung" darzustellen. Das Problem ist, zumindest in POSIX, dass es -1
noch nie einen gültigen Statuscode gab und gibt. man 3 exit
veranschaulicht, dass exit()
der Wert von status & 0377
an das übergeordnete Element zurückgegeben -1
wird , was bedeutet, dass wird 255
. Auf Nicht-POSIX-Systemen EXIT_FAILURE
wird aus Gründen der Portabilität empfohlen. Ich sehe jedoch niemals, dass "-1 bedeutet, dass eine abnormale Beendigung vorliegt" in Verbindung mit "EXIT_FAILURE kann etwas anderes als 1 sein", was darauf hinweist, dass "-1" auch auf Nicht-POSIX-Systemen eindeutig konventionell ist.
Hier ist ein Beispiel für eine StackOverflow-Frage , die dies aufrechterhält . Die Software "unrealircd" ist auch ein Beispiel für ein Programm, mit exit(-1)
dem das Programm beendet wird. In der Praxis ist es schwierig, eine Schnittstelle zu erstellen systemd
.
Woher kommt dieses Anti-Pattern? Ist es in irgendeinem Zusammenhang gültig?
quelle
unsigned char
.char
da sein Wertebereich zwischen -128 und 127 liegt. Außerdem habe ich bereits angegeben, dass "-1" in meinem Fragekörper in "255" umgewandelt wird .Antworten:
Fast alle Unix-Computer verwenden das Zweierkomplement für ganze Zahlen, und im Zweierkomplement ist -1 unabhängig von der Wortgröße immer "alle Bits 1". Wenn Sie den größtmöglichen Exit-Code unabhängig von der Größe des Exit-Status des Programms wünschen, reicht es aus, -1 zu verwenden und die Bibliothek abschneiden zu lassen.
Dies ist nützlich, da Skripte oder Programme, die mehr als einen möglichen Exit-Status haben (siehe
grep
ein einfaches Beispiel), in der Regel den kleinsten Zahlen zugeordnet werden, sodass der größtmögliche Exit-Code für "unbekannte Fehler" oder " abbrechen ", da es unwahrscheinlich ist, dass es jemals zu einem Konflikt mit einem aussagekräftigen Statuswert kommt.quelle
exit()
als implementiertstatus &= 0xff
. Gibt es eine "Wortgröße", in der-1 & 0xff
nicht 255 ist? Natürlich nicht, denn der ganze Zweck ist es, es in den Bereich von 0-255 zu passen. Ungeachtet dessen macht Ihr letzter Satz keinen Sinn: Die Statuscodes 128-255 haben in UNIX-Systemen einen besonderen Zweck.