Wie erhalte ich, was meine main-Funktion zurückgegeben hat?

Lesezeit: 6 Minuten

Benutzeravatar von Jeegar Patel
Jeegar Patel

Wenn wir in einem C-Programm Eingaben vom Terminal aus machen möchten, können wir dies folgendermaßen tun:

int main(int argc, char *argv[])

Auf die gleiche Weise, wenn wir den Rückgabewert von erhalten möchten main() Funktion dann, wie können wir es bekommen?

In jedem main() wir schreiben return 1 oder return 0; Wie kann ich wissen, was meine main() ist am Terminal zurückgekehrt?

Bearbeiten: 1

Ich verstehe es so echo $? wir können den Rückgabewert von erhalten main() aber es erlaubt mir nur, einen Wert kleiner als 125 (unter Linux) erfolgreich zurückzugeben. Ein größerer Rückgabewert als dieser kann von der nicht erfolgreich empfangen werden $ variable Also

warum ist int der Rückgabetyp von main()? Warum nicht behalten short int?

Bearbeiten2

Woher kann ich die Bedeutung des Fehlercodes erfahren, wenn main() gibt einen Wert größer als 125 zurück?

  • Es gibt keinen wirklichen Vorteil zu wählen short Über int es sei denn, Sie haben viele davon an derselben Stelle (Array oder Struktur). Es ist nicht schneller, eine zu haben short und auf modernen ABIs spart man mit der Wahl oft nicht einmal Platz. An einigen Stellen short ist langsamer, weil Sie beim Laden eine Zeichenerweiterung vornehmen müssen.

    – Dietrich Ep

    25. Dezember 2011 um 6:05 Uhr


  • überrascht von einem downvote..!!!

    – Jeegar Patel

    28. Dezember 2011 um 5:10 Uhr


  • @Jeegar Patel …. Sie müssen verstehen, dass einige Leute immer Hasser sind

    – Mayukh Sarkar

    3. Oktober 2015 um 16:58 Uhr

  • Ich denke, das hängt mit der Größe der CPU-Register zusammen.

    – Leonardo Hernández

    17. März um 21:17 Uhr

Benutzeravatar von CB Bailey
CB Bailey

Die meisten Shells speichern den Exit-Code des vorherigen run-Befehls in $? damit Sie es speichern oder anzeigen können.

$ ./a.out
$ echo $?     # note - after this command $? contains the exit code of echo!

oder

$ ./a.out
$ exit_code=$?    # save the exit code in another shell variable.

Beachten Sie, dass Sie unter Linux zwar eine zurückgeben int, sind im Allgemeinen nur Werte unter 126 sicher zu verwenden. Höhere Werte sind reserviert, um andere Fehler aufzuzeichnen, die auftreten können, wenn versucht wird, einen Befehl auszuführen, oder um aufzuzeichnen, welches Signal, falls vorhanden, Ihr Programm beendet hat.

  • Ich kenne keine UNIX-Variante, die mehr als die niedrigsten 8 Bits behält.

    – Mike DeSimone

    24. Dezember 2011 um 18:17 Uhr

  • @MikeDeSimone: Ich habe gerade die Bash-Manpage überprüft, und es ist tatsächlich weniger, als ich mich erinnerte. Wenn Sie versuchen, >125 zu verwenden, können Sie mit Werten kollidieren, die die Shell verwendet. Bei anderen Muscheln bin ich mir nicht sicher.

    – CB Bailey

    24. Dezember 2011 um 18:22 Uhr

  • Guter Punkt. Unix erlaubt bis zu 255 auf Betriebssystemebene, aber es schreibt nicht vor, dass die Shell all diese beibehält …

    – Mike DeSimone

    24. Dezember 2011 um 20:01 Uhr

Ihre Shell hat wahrscheinlich eine spezielle Variable $?, die den letzten vom Programm zurückgegebenen Wert enthält. Kurz nachdem Ihr Programm beendet ist, können Sie Folgendes ausführen:

echo $?

um den zurückgegebenen Wert zu sehen.

  • Nur die niedrigen 8-Bits werden interpretiert (deshalb muss der zurückgegebene Wert im Bereich 0-255 liegen). Die 127 kommt von der Darstellung negativer Ganzzahlen, die dann als vorzeichenlos interpretiert werden.

    – Sidyl

    24. Dezember 2011 um 18:27 Uhr

  • @sidyll: Ich denke, du meinst 7-Bit, nicht 8-Bit. Die niedrigen 8 Bits von -1 wären 255, die niedrigen 7 Bits sind 127.

    – CB Bailey

    24. Dezember 2011 um 19:13 Uhr

  • @eharvest: Ich verstehe deine Arbeit nicht. -1 sind viele Einsen, kürzen Sie das auf 8 Bit und behandeln Sie es als signiert und Sie haben immer noch -1, behandeln Sie es als unsigned und Sie haben 255.

    – CB Bailey

    24. Dezember 2011 um 23:40 Uhr


Unter DOS/Windows können Sie verwenden errorlevel innerhalb einer Batchdatei

executable optional arguments
if errorlevel 4 goto LABEL4
if errorlevel 3 goto LABEL3
if errorlevel 2 goto LABEL2
if errorlevel 1 goto LABEL1
:SUCCESS
echo SUCCESS; errorlevel 0
goto :eof
:LABEL1
echo FAILURE; errorlevel 1
goto :eof
:LABEL2
echo FAILURE; errorlevel 2
goto :eof
REM ...

Denken Sie nur daran, vom Größten zum Niedrigsten zu suchen, weil if errorlevel 42 bedeutet wirklich “wenn errorlevel 42 oder größer ist”

  • +1 @Alex: guter Punkt. Zu meiner Verteidigung habe ich das Tag erst bemerkt, nachdem ich angefangen hatte, die Antwort zu schreiben – und beschlossen, es zu vervollständigen und zu posten

    – pmg

    25. Dezember 2011 um 0:03 Uhr

  • +1 Gute Antwort. Ich habe nach einer Windows-spezifischen Methode gesucht, für die wahrscheinlich keine separate Frage erforderlich ist.

    – AbdullahC

    25. Dezember 2011 um 1:09 Uhr

  • +1, da es immer noch schön ist, dies in Zukunft an einem Ort nachschlagen zu können (obwohl ich kaum in Windows arbeite)

    – Gnometorule

    25. Dezember 2011 um 4:03 Uhr

Kommentare und Kleinigkeiten zusammenfassen, damit sie an einem Ort sind.

AC-Programm hat immer eine Exit-Codedie das Programm bei normaler Beendigung selbst entscheiden kann, indem es einen Wert aus der zurückgibt main Funktion oder durch Aufrufen der exit Funktion. Wenn das Programm abnormal beendet wird, beispielsweise durch einen Segmentierungsfehler, entscheidet das Betriebssystem über den Beendigungscode.

In Unix (Posix) ist der Exit-Code ein 8-Bit-Wert: 0-255. Es wird mit einigen anderen Metadaten zu einem kombiniert Status: Die anderen Metadaten enthalten Informationen darüber, ob das Programm normal beendet wurde oder nicht, ob es aufgrund eines Signals beendet wurde und wenn ja, welches Signal. Einzelheiten finden Sie unter warten (2) Handbuchseite.

In Unix ist auf der Shell der Status des vorherigen Befehls als zugänglich $? spezielle Variable. Da der Exit-Code nur 8 Bit lang ist und als Ganzzahl ohne Vorzeichen behandelt wird, wird ein negativer Wert in einen positiven umgewandelt: -1 wird zu 255. Ebenso wenig, wenn Sie einen Wert größer als 255 zurückgeben Es werden signifikante 8 Bits verwendet: 256 wird 0.

Der Rückgabetyp von main ist intstatt short oder char, weil es keinen besonderen Vorteil hat, es zu einem kleineren Typ zu machen, besonders zu diesem Zeitpunkt in der Geschichte, Jahrzehnte nachdem es beschlossen wurde. Es jetzt zu ändern, würde nur unnötige Komplikationen verursachen.

Wenn Sie ein Programm aus C ausführen möchten, bietet die Standardbibliothek die system Funktion, die praktischerweise den Status des Programms zurückgibt. (Beachten Sie, dass system führt Befehle über die Shell aus, und Sie müssen sehr vorsichtig sein, alles korrekt zu maskieren, wenn Sie dem Befehl extern bereitgestellte Dateinamen oder andere Dinge in der Befehlszeile geben.)

Für mehr Flexibilität können Sie andere Programme mit den Systemaufrufen ausführen fork, execl (oder eine seiner Varianten, siehe die ausführen(3) Handbuchseite) und wait (oben schon erwähnt). Dies ist leistungsfähig und flexibel, aber es können auch leicht Fehler gemacht werden, also lesen Sie unbedingt zuerst die Dokumentation und sehen Sie sich einige Beispielprogramme an. (Andererseits macht es sehr viel Spaß, dieses Zeug zu lernen.)

Benutzeravatar von Shameerariff
Shameeriff

Sie können die Exit-Werte mit dem Befehl basic linux command echo $? Die Fehlercodes sind Standard und die Details werden darin erklärt
Verknüpfung

Die allgemeinen Codes sind

**

0- Erfolg

1- allgemeine Fehler

126- Berechtigungsproblem

127-Illegaler Befehl

128-Ungültige Argumente und schwerwiegende Fehler

255-Außerhalb des Bereichs**

Benutzeravatar von Abhishek Mane
Abhishek Mähne

in der Windows-Befehlszeile, um den Rückgabewert von der Hauptverwendung zu lesen echo %errorlevel%

(Code) return.c

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
    int i;

    printf("Enter a number");
    scanf("%d",&i);

   if(i==2)
        exit(1);
   if(i==3)
        exit(2);
    
   return 0;
}

AUSGANG

AUSGANG des obigen Programms zurück.c

1416300cookie-checkWie erhalte ich, was meine main-Funktion zurückgegeben hat?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy