Wie lauten die Mindest- und Höchstwerte der folgenden Exit-Codes unter Linux:
- Der von einer ausführbaren Binärdatei zurückgegebene Exit-Code (z. B. ein C-Programm).
- Der Exit-Code, der von einem Bash-Skript zurückgegeben wurde (beim Aufruf
exit
). - Der von einer Funktion zurückgegebene Exit-Code (beim Aufruf
return
). Ich denke das ist zwischen0
und255
.
linux
executable
function
exit-status
user271801
quelle
quelle
return
.bash
Shell. Einige andere Shells wiezsh
können jeden vorzeichenbehafteten 32-Bit-Wert wie für zurückgebenexit
. Einige mögenrc
oderes
können Daten eines von ihnen unterstützten Typs (Skalar oder Liste) zurückgeben. Weitere Informationen finden Sie in den verknüpften Fragen und Antworten.Antworten:
Die an den
_exit()
/exit_group()
system-Aufruf übergebene Nummer (manchmal als Exit-Code bezeichnet) , um die Mehrdeutigkeit des Exit-Status zu vermeiden. Dies bezieht sich auch auf die Codierung des Exit-Codes oder der Signalnummer und zusätzliche Informationen, je nachdem, ob der Prozess abgebrochen oder normal beendet wurde ) ist vom Typint
, also auf Unix-ähnlichen Systemen wie Linux in der Regel eine 32-Bit-Ganzzahl mit Werten von -2147483648 (-2 31 ) bis 2147483647 (2 31 -1).Jedoch auf allen Systemen, wenn die Eltern - Prozess (oder das Kind subreaper oder
init
wenn die Eltern gestorben ist ) verwendet diewait()
,waitpid()
,wait3()
,wait4()
Systemaufrufe , um es abzurufen, werden nur die unteren 8 Bits davon sind verfügbar (Werte von 0 bis 255 (2 8 - 1)).Bei Verwendung der
waitid()
API (oder eines Signal-Handlers auf SIGCHLD) ist auf den meisten Systemen (und wie POSIX in der Ausgabe 2016 des Standards (siehe_exit()
Spezifikation ) jetzt klarer vorschreibt ) die vollständige Nummer verfügbar (imsi_status
Feld der zurückgegebenen Struktur) ). Unter Linux ist dies jedoch noch nicht der Fall, wodurch die Zahl mit derwaitid()
API ebenfalls auf 8 Bit gekürzt wird. Dies wird sich jedoch wahrscheinlich in Zukunft ändern.Im Allgemeinen würden Sie nur wollen Werte verwenden 0 ( in der Regel bedeutet , Erfolg) auf nur 125, so viele Schalen - Werte über 128 in ihrer Verwendung
$?
Darstellung des Exit - Status die Signalnummer eines Prozesses zu kodieren , getötet zu werden , und 126 und 127 für Sonder Bedingungen.Möglicherweise möchten Sie 126 bis 255 verwenden
exit()
, um dasselbe zu bedeuten wie für die Shell$?
(wie bei einem Skriptret=$?; ...; exit "$ret"
). Die Verwendung von Werten außerhalb von 0 -> 255 ist im Allgemeinen nicht sinnvoll. Das tun Sie im Allgemeinen nur, wenn Sie wissen, dass das übergeordnete Element diewaitid()
API auf Systemen verwendet, die nicht abgeschnitten sind und Sie zufällig den 32-Bit-Wertebereich benötigen. Beachten Sieexit(2048)
, dass dies beispielsweise von Eltern, die die traditionellenwait*()
APIs verwenden , als Erfolg gewertet wird.Mehr Infos unter:
Die Q & A sollte hoffentlich die meisten Ihre Fragen beantworten und klären , was gemeint ist mit Exit - Status . Ich werde noch ein paar Dinge hinzufügen:
Ein Prozess kann nur dann beendet werden, wenn er beendet wurde oder die
_exit()
/exit_group()
system-Aufrufe aufruft. Wenn Sie vonmain()
in zurückkehrenC
, ruft die libc diesen Systemaufruf mit dem Rückgabewert auf.Die meisten Sprachen haben eine
exit()
Funktion, die diesen Systemaufruf und den Wert, den sie annehmen, umschließt. (Beachten Sie, dass diese im Allgemeinen mehr tun als die Bereinigung durch die C-exit()
Funktion, mit der die Stdio-Puffer geleert und dieatexit()
Hooks ausgeführt werden ...)Das ist zumindest der Fall bei:
Sie sehen gelegentlich einige, die sich beschweren, wenn Sie einen Wert außerhalb von 0-255 verwenden:
Einige Muscheln beschweren sich, wenn Sie einen negativen Wert verwenden:
POSIX lässt das Verhalten undefiniert, wenn der an das
exit
Special Builtin übergebene Wert außerhalb von 0 -> 255 liegt.Einige Shells zeigen unerwartetes Verhalten, wenn Sie Folgendes tun:
bash
(undmksh
nicht,pdksh
worauf es basiert) setzt voraus, dass der Wert auf 8 Bits gekürzt wird:Wenn Sie also in diesen Shells mit einem Wert außerhalb von 0-255 beenden möchten, müssen Sie Folgendes tun:
Das ist ein weiterer Befehl in dem gleichen Prozess ausführen, kann den Systemaufruf mit dem Wert rufen Sie wollen.
Wie bereits in den anderen Fragen und
ksh93
Antworten erwähnt, hat es das seltsamste Verhalten für Exit-Werte von 257 bis 256 + max_signal_number, wobeiexit_group()
es sich selbst mit dem entsprechenden Signal beendet, anstatt aufzurufen¹.und schneidet sonst die Zahl wie
bash
/ abmksh
.¹ Das wird sich wahrscheinlich in der nächsten Version ändern. Jetzt, da die Entwicklung von
ksh93
als Gemeinschaftsanstrengung außerhalb von AT & T übernommen wurde, wird dieses Verhalten, obwohl es irgendwie von POSIX gefördert wird, rückgängig gemachtquelle
si_status
für Linux gibt?int
mindestens 16 Bit erforderlich sind , muss für POSIX mehr oder weniger mindestens 32 Bit angegeben werden, und für Programmierumgebungen muss uint32_t angegeben werden . Ich weiß nicht, ob Linux eine Programmierumgebung unterstützt, in der Ints alles andere als 32 Bit sind. Ich bin nie auf eine gestoßen.Das Minimum ist
0
, und das ist der Erfolgswert. Alle anderen sind Fehlschläge. Das Maximum ist255
auch bekannt als-1
.Diese Regeln gelten sowohl für Skripte und andere ausführbare Dateien als auch für Shell-Funktionen.
Größere Werte ergeben modulo 256.
quelle
bash
oder in anderen am häufigsten verwendeten) der an dasexit
Builtin übergebene Exit-Code nicht als Modulo-256 behandelt und verursacht stattdessen einen Fehler. (Zum Beispiel ist das Commonexit -1
eigentlich kein tragbares Äquivalent zu denexit 255
meisten Shells). Und obexit(-1)
auf der C-Ebene gleichbedeutend mitexit(255)
ist , ist ein Detail, das de facto sicher funktioniert, sich jedoch auf das implementierungsdefinierte Verhalten stützt (obwohl dies bei modernen Systemen, die Sie wahrscheinlich in der Praxis verwenden, kein Problem darstellt).exit(1)
Parameter auf 8 Bits.Das sieht so einfach aus, aber oh, das Leid.
Die C-Sprache (und danach die meisten anderen Sprachen direkt oder indirekt) erfordert, dass die Rückkehr von
main
dem Aufrufexit
mit dem gleichen Argument wie der Rückgabewert äquivalent ist. Dies ist eine Ganzzahl (der Rückgabetyp ist sehr eindeutigint
), daher wäre der Bereich im PrinzipINT_MIN
zuINT_MAX
.POSIX gibt jedoch an, dass nur die untersten 8 übergebenen Bits
exit
einem wartenden übergeordneten Prozess zur Verfügung gestellt werden sollen, wörtlich so, als wäre es "status & 0xFF" .In der Praxis ist der Exit-Code also eine (noch vorzeichenbehaftete) Ganzzahl, von der nur die niedrigsten 8 Bits gesetzt sind.
Das Minimum ist also -128 und das Maximum 127. Warte, das stimmt nicht. Es wird 0 bis 255 sein.Aber leider kann es natürlich nicht so einfach sein . In der Praxis macht Linux (oder besser Bash) das anders . Der gültige Bereich der Rückkehrcodes liegt zwischen 0 und 255 (dh ohne Vorzeichen).
Um Verwechslungen zu vermeiden, ist es wahrscheinlich eine gute Idee, einfach davon auszugehen, dass die Rückkehrcodes nicht signiert sind, und alles, was Sie zurückerhalten,
wait
in nicht signiert umzuwandeln. Auf diese Weise stimmt es mit dem überein, was Sie in einer Shell sehen. Da die obersten Bits (einschließlich des höchstwertigen) gelöscht werden, ist dies nicht einmal "falsch", da die tatsächlichen Werte, obwohl technisch signiert, immer ohne Vorzeichen sind (da das Vorzeichenbit niemals gesetzt ist).Es hilft auch, den allgemeinen Fehler beim Vergleichen eines Exit-Codes mit zu vermeiden
-1
, der aus irgendeinem seltsamen Grund selbst dann nicht zu erscheinen scheint, wenn ein Programm mit beendet wird-1
(raten Sie mal, warum!).Über Ihren letzten Punkt, von einer Funktion zurückzukehren, wenn diese Funktion zufällig ist
main
, dann siehe oben. Ansonsten hängt es vom Rückgabetyp der Funktion ab, es kann im Prinzip alles (einschließlichvoid
) sein.quelle
waitid()
vorgestellt wurde.waitid()
macht genau das gleiche, etwas anders. Es wartet auf eine bestimmte ID oder einem Faden, und es schreibt Ergebnisse der Spitz zusiginfo_t
Struktur , wosi_status
istint
(so ... unterzeichnet , nur das gleiche). Trotzdemexit()
passiert nur die untersten 8 Bits, also ... absolut das Gleiche unter der Haube.exit()
Übergibt alle 32 Bits des Parameters an den Kernel undwaitid()
gibt alle 32 Bits des Exit-Codes zurück. Vielleicht haben Sie unter Linux nachgesehen, wo es niemanden interessiert, Fehler zu beheben. Wenn Sie mir nicht glauben, überprüfen Sie es auf einem POSIX-kompatiblen Betriebssystem ...exit
, insbesondere die zweite Zeile unter "Beschreibung", die besagt: "obwohl einem wartenden übergeordneten Prozess nur die niedrigstwertigen 8 Bits (dh Status & 0377) zur Verfügung stehen sollen " . So funktioniert eine konforme Implementierung - unterste 8 Bit, nicht 32. Haben Sie eine Referenz für die Weitergabe von 32 Bit?waitid()
und diesiginfo_t
Struktur an denSIGCHLD
Handler zurückgeben alle 32 Bits desexit()
Parameters.Exit-Codes für jeden Prozess - ob es sich um eine binäre ausführbare Datei, ein Shell-Skript oder etwas anderes handelt - reichen von 0 bis 255. Es ist möglich, einen größeren Wert an zu übergeben
exit()
, aber nur die unteren 8 Bits des Status werden zur Verfügung gestellt andere Prozesse durchwait()
.Die AC-Funktion kann als Rückgabe fast jedes Typs deklariert werden. Die Grenzen seines Rückgabewerts werden vollständig von diesem Typ bestimmt: beispielsweise -128 bis 127 für eine Funktionsrückgabe
signed char
oder 0 bis 4,2 Milliarden für eine Funktionsrückgabeunsigned int
oder eine beliebige Gleitkommazahl bis einschließlichinf
einer Funktionsrückgabedouble
. Und das zählt nicht die nicht-numerischen Typen wievoid *
oderstruct
...quelle