2010-09-17 9 views
20

Ich versuche, einen größeren Wert wie 1000 von meiner Hauptfunktion zurückzukehren, aber wenn ich echo $? geben Sie es zeigt 0.Warum kann ich größere Werte nicht von der Hauptfunktion zurückgeben?

Wenn ich einen kleineren Wert wie 100 zurückgeben den korrekten Wert anzeigt.

Mein Code:

int main(void) 
{ 
    return 1000; 
} 

Gibt es eine Beschränkung auf die Werte, die wir zurückkommen können?

+0

Ich bekomme ** 232 ** für 'return 1000;' und ** 233 ** für 'return 1001;' – Lazer

+5

** 1000% 256 = 232 ** – Lazer

Antwort

22

Es gibt zwei verwandte Konzepte hier: C-Exit-Status und Bash-Return-Code. Sie decken beide den Bereich von 0 bis 255 ab, aber Bash verwendet Zahlen über 126 für eigene Zwecke, so dass es verwirrend wäre, diese aus Ihrem Programm zurückzugeben.

Um sicher zu sein, begrenzen Sie die Statuscodes des Ausgangs auf 0-127, da dies am tragbarsten ist, zumindest impliziert durch http://docs.python.org/library/sys.html#sys.exit.

Der C-Exit-Status wird in die bash $ gesetzt? Variable nach der Ausführung, aber Bash verwendet 127, um "Befehl nicht gefunden" anzuzeigen, also möchten Sie das vielleicht vermeiden. Bash reference page.

Bash verwendet auch 128-255 für Signale - sie zeigen an, dass der Prozess mit einem Signal beendet wurde: exit code = 128 + signal number. Sie können also mit Zahlen umgehen, die nahe bei 255 liegen, da es unwahrscheinlich ist, dass die Signalzahlen so hoch gehen.

Jenseits dieser allgemeinen Richtlinien gibt es viele Versuche zu definieren, was verschiedene Zahlen bedeuten sollten: http://tldp.org/LDP/abs/html/exitcodes.html.

So wollen Sie eine beliebige ganze Zahl aus Ihrem Programm zurückgeben, ist es wahrscheinlich am besten, es auf stdout zu drucken, und erfassen Sie es mit VALUE=$(program) von Ihrem Bash-Skript.

+0

Ich glaube, der Bereich ist 0-255 (dh die Bereich von 'uint8_t') auf * NIX-Systemen - nicht vertraut mit Systemen mit einem Maximalwert von 127 (was bedeuten würde, dass ein vorzeichenbehafteter Rückgabetyp äquivalent zu' int8_t 'wäre, aber das würde auch eine untere Grenze von -128 implizieren). –

+0

+1 Danke für die Erklärung:) – Searock

+0

Neben der Angabe eines falschen Bereichs (wie @ Jonathan bemerkte), scheinen Sie auch den Programm-Exit-Status (wie von 'waitpid (2)') und den Shell-Befehl Exit-Status (wie berichtet von '$?'). "128-255 werden für Signale verwendet" gilt nur für Letzteres. –

3

Der Rückgabewert von main (d. H. Der Beendigungsstatus der Anwendung) ist auf den Bereich [0, 255] on * NIX beschränkt. 1000 liegt außerhalb des Bereichs und das Betriebssystem behandelt es vermutlich als 0.

+2

Nein, zumindest in bash gibt ein Exit-Status größer als 255 den Wert modulo 256 zurück. 1000 gibt 232 zurück. –

+0

Das würde ich annehmen, basierend darauf, wie C Zahlen behandelt, aber das OP sagte, dass er 0 als Ergebnis erhalten würde. –

1

Im Unix-Land ist der Rückgabewert von main begrenzt, da dort auf den Bereich eines 8-Bit-Bytes beschränkt ist.

In Windows gibt es einen einzigen Wert, STILL_ACTIVE mit Wert 259, der am besten als Prozessbeendigungscode vermieden wird.

Darüber hinaus können Sie in Windows einen 32-Bit-Code wie HRESULT zurückgeben, und das ist üblich.