Warum erhalte ich Fehler 255, wenn ich -1 zurückgebe?

10

Ich bin neu in der C ++ - Programmierung und habe eine sehr grundlegende Frage. Ich habe festgestellt, dass -1ich bekomme , wenn ich in ein C ++ - Programm zurückkehre und dann den Exit-Status überprüfe 255. Warum ist das so?

Der Code ist der grundlegendste:

int main()
    {
        return -1;
    }

Dann, nachdem Sie den kompilierten Code ausgeführt haben:

echo $?
255
Eugene S.
quelle

Antworten:

23

Da in UNIX / POSIX der Exit-Code eines Programms als vorzeichenloser 8-Bit-Wert definiert ist. Das Konvertieren von -1 in vorzeichenloses 8-Bit ergibt 255.

Bearbeiten, um hinzuzufügen:

Weitere Einzelheiten: Die Systemaufruffamilie wait * () in UNIX codiert das Ergebnis eines Prozesses in eine einzelne 32-Bit-Ganzzahl. Die 32 Bits dieses Ergebnisses werden weiter aufgeteilt, um Informationen bereitzustellen, wie z. B. ob der Prozess-Dumped-Core aufgrund eines Signals (und welches) beendet wurde usw. Von diesen 32 Bits sind nur 8 für den Exit-Code des Prozesses reserviert und diese werden als vorzeichenloser Wert interpretiert.

Das Fork / Exec / Wait-Modell von UNIX / POSIX ist eine der ältesten und am tiefsten eingebetteten Funktionen. Wenn Sie heute ein neues Betriebssystem entwerfen, können Sie etwas anderes tun (verwenden Sie mindestens 64 Bit :-)).

Auf der anderen Seite ist es praktisch wirklich nützlich,> 255 Exit-Codes zu haben? Ich bezweifle das. Wenn Sie wirklich etwas Stärkeres wollen, würde ich vorschlagen, dass Sie zu einer "Exit-Zeichenfolge" wechseln, anstatt zu einem numerischen Exit-Code mit einem größeren Bereich.

Verrückter Wissenschaftler
quelle
Schöne Bearbeitung. Vielen Dank für diese zusätzlichen Informationen.
George M
7

Um aus der bashManpage auf EXIT STATUS zu zitieren

Der Exit-Status eines ausgeführten Befehls ist der Wert, der vom Systemaufruf waitpid oder einer entsprechenden Funktion zurückgegeben wird. Der Exit-Status liegt zwischen 0 und 255, obwohl die Shell, wie unten erläutert, speziell Werte über 125 verwenden kann. Exit-Status von Shell-Buildins und zusammengesetzten Befehlen sind ebenfalls auf diesen Bereich beschränkt. Unter bestimmten Umständen verwendet die Shell spezielle Werte, um bestimmte Fehlermodi anzuzeigen.

Ich bin tatsächlich genauso überrascht wie Sie.

Von der waitpid (2)Manpage:

WEXITSTATUS(status)

Gibt den Exit-Status des Kindes zurück. Dies besteht aus den niedrigstwertigen 8 Bits des Statusarguments, das das untergeordnete Element in einem Aufruf zum Beenden (3) oder _exit (2) oder als Argument für eine return-Anweisung in main () angegeben hat. Dieses Makro sollte nur verwendet werden, wenn WIFEXITED true zurückgegeben hat.

utopiabound
quelle