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 Typ int
, 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 die wait()
, 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 (im si_status
Feld der zurückgegebenen Struktur) ). Unter Linux ist dies jedoch noch nicht der Fall, wodurch die Zahl mit der waitid()
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 Skript ret=$?; ...; 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 die waitid()
API auf Systemen verwendet, die nicht abgeschnitten sind und Sie zufällig den 32-Bit-Wertebereich benötigen. Beachten Sie exit(2048)
, dass dies beispielsweise von Eltern, die die traditionellen wait*()
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 von main()
in zurückkehren C
, 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 die atexit()
Hooks ausgeführt werden ...)
Das ist zumindest der Fall bei:
$ strace -e exit_group awk 'BEGIN{exit(1234)}'
exit_group(1234) = ?
$ strace -e exit_group mawk 'BEGIN{exit(1234)}'
exit_group(1234) = ?
$ strace -e exit_group busybox awk 'BEGIN{exit(1234)}'
exit_group(1234) = ?
$ echo | strace -e exit_group sed 'Q1234'
exit_group(1234) = ?
$ strace -e exit_group perl -e 'exit(1234)'
exit_group(1234) = ?
$ strace -e exit_group python -c 'exit(1234)'
exit_group(1234) = ?
$ strace -e exit_group expect -c 'exit 1234'
exit_group(1234) = ?
$ strace -e exit_group php -r 'exit(1234);'
exit_group(1234) = ?
$ strace -e exit_group zsh -c 'exit 1234'
exit_group(1234)
Sie sehen gelegentlich einige, die sich beschweren, wenn Sie einen Wert außerhalb von 0-255 verwenden:
$ echo 'm4exit(1234)' | strace -e exit_group m4
m4:stdin:1: exit status out of range: `1234'
exit_group(1) = ?
Einige Muscheln beschweren sich, wenn Sie einen negativen Wert verwenden:
$ strace -e exit_group dash -c 'exit -1234'
dash: 1: exit: Illegal number: -1234
exit_group(2) = ?
$ strace -e exit_group yash -c 'exit -- -1234'
exit: `-1234' is not a valid integer
exit_group(2) = ?
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
(und mksh
nicht, pdksh
worauf es basiert) setzt voraus, dass der Wert auf 8 Bits gekürzt wird:
$ strace -e exit_group bash -c 'exit 1234'
exit_group(210) = ?
Wenn Sie also in diesen Shells mit einem Wert außerhalb von 0-255 beenden möchten, müssen Sie Folgendes tun:
exec zsh -c 'exit -- -12345'
exec perl -e 'exit(-12345)'
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, wobei exit_group()
es sich selbst mit dem entsprechenden Signal beendet, anstatt aufzurufen¹.
$ ksh -c 'exit "$((256 + $(kill -l STOP)))"'
zsh: suspended (signal) ksh -c 'exit "$((256 + $(kill -l STOP)))"'
und schneidet sonst die Zahl wie bash
/ ab mksh
.
¹ 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 gemacht
return
.