Warum erhalte ich Fehler 255, wenn ich -1
On Februar 17, 2021 by admin zurückgebe? Ich bin neu in der C ++ – Programmierung und habe eine sehr grundlegende Frage. Ich habe das bemerkt, als ich Geben Sie -1
im C ++ – Programm zurück und überprüfen Sie den Exit-Status. Ich erhalte 255
. Warum ist das so?
Der Code ist der grundlegendste:
int main() { return -1; }
Nach dem Ausführen des kompilierten Codes:
echo $? 255
Antwort
Da in UNIX / POSIX der Exit-Code eines Programms als definiert ist ein vorzeichenloser 8-Bit-Wert. Das Konvertieren von -1 in vorzeichenloses 8-Bit ergibt 255.
Bearbeiten, um Folgendes hinzuzufügen:
Weitere Informationen: Die Systemaufruffamilie wait * () in UNIX codiert das Ergebnis von a Prozess in eine einzelne 32-Bit-Ganzzahl. Die 32 Bits dieses Ergebnisses werden weiter aufgeteilt, um Informationen zu liefern, wie beispielsweise, 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önnten Sie etwas anderes tun (mindestens 64 Bit verwenden :-)).
Andererseits ist es praktisch wirklich nützlich,> 255 Exit-Codes zu haben? Ich bezweifle das. Wenn Sie wirklich etwas Stärkeres wollten, würde ich vorschlagen, dass Sie zu einer „Exit-Zeichenfolge“ wechseln, anstatt zu einem numerischen Exit-Code mit einem größeren Bereich.
Kommentare
- Schöne Bearbeitung. Vielen Dank für diese zusätzlichen Informationen.
Antwort
Um aus bash
Manpage auf EXIT STATUS
Der Exit-Status eines ausgeführten Befehls ist der Wert, der vom Systemaufruf waitpid oder einer entsprechenden Funktion zurückgegeben wird. Der Beendigungsstatus 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.
Damit sie diesen Bereich begrenzt, bin ich tatsächlich genauso überrascht wie Sie sind es.
Von der waitpid (2)
Manpage:
WEXITSTATUS(status)
gibt den Beendigungsstatus des untergeordneten Elements 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 (). Dieses Makro sollte nur verwendet werden, wenn WIFEXITED true zurückgibt.
Schreibe einen Kommentar