GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Die Min- und Max-Werte von Exit-Codes in Linux?

Was sind die Mindest- und Höchstwerte der folgenden Exit-Codes in Linux:

  1. Der Exit-Code, der von einer ausführbaren Binärdatei (z. B. einem C
    -Programm) zurückgegeben wird.
  2. Der von einem Bash-Skript zurückgegebene Exit-Code (beim Aufrufen von exit ).
  3. Der Exit-Code, der von einer Funktion zurückgegeben wird (beim Aufrufen von return ). Ich
    denke, das ist zwischen und 255 .

Akzeptierte Antwort:

Die an _exit() übergebene Zahl /exit_group() Systemaufruf (manchmal auch als Exit-Code bezeichnet um die Zweideutigkeit mit Ausgangsstatus zu vermeiden was sich auch auf eine Kodierung entweder des Beendigungscodes oder der Signalnummer und zusätzlicher Informationen bezieht, je nachdem, ob der Prozess beendet oder normal beendet wurde) ist vom Typ int , also auf Unix-ähnlichen Systemen wie Linux, typischerweise eine 32-Bit-Ganzzahl mit Werten von -2147483648 (-2) bis 2147483647 (2-1).

Wenn jedoch auf allen Systemen der übergeordnete Prozess (oder der untergeordnete Subreaper oder init wenn der Elternteil gestorben ist) verwendet wait() , waitpid() , wait3() , wait4() Systemaufrufe, um es abzurufen, sind nur die unteren 8 Bits davon verfügbar (Werte 0 bis 255 (2-1)).

Bei Verwendung der waitid() API (oder ein Signal-Handler auf SIGCHLD) auf den meisten Systemen (und wie POSIX es jetzt in der Ausgabe 2016 des Standards deutlicher fordert (siehe _exit()). Spezifikation)), ist die vollständige Nummer verfügbar (im si_status Feld der zurückgegebenen Struktur). Unter Linux ist dies jedoch noch nicht der Fall, wo die Zahl auch mit waitid() auf 8 Bit gekürzt wird API, obwohl sich das in Zukunft wahrscheinlich ändern wird.

Im Allgemeinen möchten Sie nur Werte von 0 (was im Allgemeinen Erfolg bedeutet) bis 125 verwenden, da viele Shells Werte über 128 in ihrem $? verwenden Darstellung des Ausgangsstatus um die Signalnummer eines beendeten Prozesses zu kodieren und 126 und 127 für spezielle Bedingungen.

Sie können 126 bis 255 für exit() verwenden dasselbe bedeuten wie für $? der Shell (wie wenn ein Skript ret=$?; ...; exit "$ret" beendet). ). Die Verwendung von Werten außerhalb von 0 -> 255 ist im Allgemeinen nicht sinnvoll. Sie würden das im Allgemeinen nur tun, wenn Sie wissen, dass der Elternteil die waitid() verwenden wird API auf Systemen, die nicht abschneiden, und Sie benötigen zufällig den 32-Bit-Wertebereich. Beachten Sie, dass wenn Sie einen exit(2048) ausführen das wird zum Beispiel von Eltern mit dem traditionellen wait*() als Erfolg gewertet APIs.

Mehr Infos unter:

  • Standard-Exit-Code, wenn der Prozess beendet wird?

Diese Fragen und Antworten sollten hoffentlich die meisten Ihrer anderen Fragen beantworten und verdeutlichen, was mit Exit-Status gemeint ist . Ich werde noch ein paar Dinge hinzufügen:

Ein Prozess kann nicht beendet werden, es sei denn, er wird beendet oder ruft _exit() auf /exit_group() Systemaufrufe. Wenn Sie von main() zurückkehren in C , ruft die libc diesen Systemaufruf mit dem Rückgabewert auf.

Die meisten Sprachen haben einen exit() Funktion, die diesen Systemaufruf umschließt, und der Wert, den sie annehmen, falls vorhanden, wird im Allgemeinen unverändert an den Systemaufruf übergeben. (Beachten Sie, dass diese im Allgemeinen mehr Dinge wie die Bereinigung durch exit() von C tun Funktion, die die stdio-Puffer leert, führt den atexit() aus Haken…)

Verwandte:Linux – Wie kann man Ubuntu APT wiederverwenden?

Das gilt zumindest für:

$ 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)

Gelegentlich sehen Sie 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 Shells 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 Wert an exit übergeben wird speziell eingebaut ist außerhalb 0->255.

Einige Shells zeigen ein unerwartetes Verhalten, wenn Sie dies tun:

  • bash (und mksh aber nicht pdksh auf dem es basiert) übernimmt es, den Wert auf 8 Bit zu kürzen:

    $ strace -e exit_group bash -c 'exit 1234'
    exit_group(210)                         = ?
    

    Wenn Sie diese Shells also 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 heißt, einen anderen Befehl im selben Prozess ausführen, der kann Rufen Sie den Systemaufruf mit dem gewünschten Wert auf.

  • wie in den anderen Fragen und Antworten erwähnt, ksh93 hat das seltsamste Verhalten für Exit-Werte von 257 bis 256+max_signal_number, wobei anstelle des Aufrufs von exit_group() , tötet es sich mit dem entsprechenden Signal¹.

    $ ksh -c 'exit "$((256 + $(kill -l STOP)))"'
    zsh: suspended (signal)  ksh -c 'exit "$((256 + $(kill -l STOP)))"'
    

    und schneidet ansonsten die Zahl wie bash ab /mksh .


Linux
  1. Überwachen Sie Befehle und Aufgaben mit dem Linux-Überwachungsbefehl

  2. Einführung in die Linux-Befehle chgrp und newgrp

  3. Der Linux-Sed-Befehl:Verwendung und Beispiele

  4. Inodes und das Linux-Dateisystem

  5. So installieren und verwenden Sie den Ping-Befehl unter Linux

Was ist der Unterschied zwischen Linux und Unix?

Die 5 besten Linux-Distributionen für Entwickler und Programmierer

Überwachung und Testen des Zustands von SSD in Linux

So finden Sie die PID und PPID eines Prozesses in Linux

Ein Windows-Typ in einer Linux-Welt:YaST und der Desktop

Linux perf:So verwenden Sie den Befehl und den Profiler