Unix-Verlauf: Rückkehrcode oktal?

10

Ich wurde heute überrascht von gdb:

Program exited with code 0146.

gdbdruckt den Rückkehrcode in Oktal ; Ich habe untersucht, warum ich Folgendes gefunden habe: http://comments.gmane.org/gmane.comp.gdb.devel/30363

Das ist aber keine besonders befriedigende Antwort. Ein kurzes Googeln enthüllte die Geschichte nicht, also hoffte ich, dass jemand auf SO die Hintergrundgeschichte kennen könnte.

Eine etwas verwandte Frage, wie würde man den Rückkehrcode überhaupt in Oktal sehen? Vielleicht haben ältere Maschinen immer den Rückkehrcode gedruckt?

$ printf %o\\n $?

Ist ziemlich umständlich :)

Klopfen
quelle
das $?ist der Wert für Return - Code Shell und ist eine Nachkommastelle (oder tut GDB Unterstützung Ihres Beispiel cmd auch?). Ich weiß nicht, warum gdb es oktal meldet. Meine Lösung besteht darin, das Alte herauszuholen, um man asciizu sehen, was die Oktalwerte bedeuten. Interessante Frage, da Sie auch auf Oktalwerte aus anderen Programmen stoßen. Vielleicht wird es in Kernighans und Pikes 'Unix Programming Envioronment' besprochen. Viel Glück.
Shellter
Der Exit-Status kann größer als eine Ziffer sein, es ist tatsächlich ein Byte. Auch man asciiwäre es nicht sinnvoll, Oktal in Dezimal umzuwandeln. bcwäre eine bessere Wahl.
Jlliagre
2
Der Rückkehrcode ist eine Zahl , nicht dezimal oder oktal. Das Programm gibt einen Status (ein Byte) zurück. Mit wait (3) oder seinem Stamm kann der übergeordnete Prozess viele Informationen darüber herausfinden, warum der Prozess beendet wurde (normalerweise, dh freiwillig durch Aufrufen von exit (2); getötet durch ein Signal, ...)
vonbrand

Antworten:

6

Die oktale Darstellung erleichtert die Interpretation des Exit-Codes für kleine Werte, die am häufigsten verwendet werden. Sollte diese Zahl, bei der es sich um ein Byte handelt, dezimal gedruckt werden, um herauszufinden, welches Signal einen Prozess unterbrochen hat, wäre im Oktal ein wenig Berechnung erforderlich. Sie können so gelesen werden, wie sie sind:

  • Ein Prozess wird mit Status 5 beendet und gdbangezeigt 05, was keinen Unterschied macht
  • Ein Prozess wird beendet, weil er ein SIGINT( Control+ C) gdbanzeigt, 0202das leichter als Signal Nr. 2 zu erkennen ist als 130.

Darüber hinaus kann der Exit-Status auch eine Bitmaske sein, und in einem solchen Fall lässt sich Oktal (zumindest wenn Sie daran gewöhnt sind, was vor ein paar Jahrzehnten häufiger war als heutzutage) mental leichter in Bits umwandeln als in Dezimalzahlen oder sogar hexadezimal, wie zum Beispiel chmodimmer noch eine Oktalzahl akzeptieren, um Dateiberechtigungen darzustellen : 0750 = 111 101 000 = rwx r-x ---.

jlliagre
quelle
wahrscheinlich der falsche Ort, um dies zu fragen, aber gibt es eine einfache Möglichkeit zu erkennen, ob eine von GDB angegebene Zahl oktal oder dezimal ist?
Marinara
3
Die Konvention ist, wenn es mit Null (0) beginnt, ist es oktal.
11.
3

Ich habe keine Kopie dieses Textes und lese nur den kurzen Klappentext, der in Google Books verfügbar ist, aber. Gemäß dem X / Open Portability-Handbuch System V Specification Commands & Utilities S. 283 (gemäß Google Books)

Wenn eine Anwendung abnormal beendet wird, lautet ihr Exit-Status oktal 0200 + und es gibt eine Liste allgemeiner Statuswerte (die wahrscheinlich auch in oktal angegeben sind).

Es ist / war also eine Fehlermeldung des schlechten Mannes.


quelle