9.17 Rückgabewert beim Beenden eines Programms 

Über dieses Thema wurden bereits ganze Threads in diversen Foren gefüllt. Generell ist der Rückgabewert beim Beenden eines Programms abhängig von der Umgebung des Betriebssystems. Unter Linux/UNIX beispielsweise bedeutet ein Rückgabewert von 0, dass ein Programm erfolgreich beendet wurde; alles andere bedeutet eben, dass irgendetwas schiefgelaufen ist.
Andere Betriebssysteme wiederum können allerdings auch einen anderen Rückgabewert als erfolgreiche Beendigung erwarten – was bedeutet, dass es hierbei keinen portablen Standard gibt.
Dennoch gibt es mit den Makros EXIT_SUCCESS und EXIT_FAILURE einen recht zuverlässigen Weg, um ein Programm zu beenden. Beide Makros sind in der Headerdatei <stdlib.h> definiert und schon seit dem C89-Standard vorhanden. Damit müssen Sie sich nicht mehr darum kümmern, welchen Wert auf welchem System Sie denn nun zurückgeben müssen, um zu melden, ob sich eine Anwendung erfolgreich oder eben nicht erfolgreich beendet hat. Bei einem erfolgreichen Ende geben Sie einfach EXIT_SUCCESS zurück und bei einem Fehler EXIT_FAILURE. Natürlich müssen Sie auch die Headerdatei <stdlib.h> mit einbinden.
Hierzu ein Beispiel, wie Sie diese beiden Makros sinnvoll einsetzen können:
/* exit_code.c */ #include <stdio.h> #include <stdlib.h> int main(void) { int val, ret; printf("Bitte Eingabe machen : "); ret = scanf("%d", &val); if(ret != 1) { printf("Fehler bei scanf()-Eingabe\n"); return EXIT_FAILURE; } if(val < 0) { printf("Fehler - Negative Zahl\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; }
Hinweis |
Von nun an sollen auch in den folgenden Listings die entsprechenden EXIT_-Makros verwendet werden. |
9.17.1 Programmende auswerten 

Jeder will Ihnen sagen, dass ein Programm bei erfolgreicher Beendigung 0 und bei einem Fehler etwas ungleich 0 zurückgeben soll. Aber wie man dies anschließend auswerten kann, erfährt man eigentlich selten. Ich will Ihnen hier jeweils einen Weg für MS-Windows und einen für Linux/Unix zeigen, wie Sie das Programmende auswerten können. Als Beispiel dient das Listing exit_code.c aus dem vorherigen Abschnitt.
MS-Windows/MS-DOS
Unter MS-Windows/MS-DOS kommt man hier mit der Batch-Programmierung recht weit. Eine Batch-Datei hat die Endung *.bat und ist in Windows und MS-DOS standardmäßig integriert. Zum Erstellen von Batch-Dateien ist ein gewöhnlicher ASCII-Editor (wie beispielsweise Notepad) ausreichend. Die Befehle einer solchen Datei werden zeilenweise abgearbeitet.
Viele DOS-Progamme liefern beim Beenden einen sogenannten Errorlevel. Dieser kann die Werte 0 bis 255 annehmen. Auch hier bedeutet gewöhnlich ein Errorlevel ungleich 0, dass ein Fehler aufgetreten ist. In unserem Fall bedeutet dies: Gibt unser Programm 0 zurück, ist der Errorlevel auch 0. Geben wir aus unserem Programm 1 zurück, dann ist der Errorlevel ebenfalls 1 usw.
Einen solchen Errorlevel können Sie mit einer üblichen if-Bedingung im Batch-Skript abfragen, zum Beispiel so:
if errorlevel 1 goto eins
Ist hier beispielsweise der Rückgabewert des Programms 1, dann wird zum Label eins gesprungen. Ein solches Label wird folgendermaßen angegeben:
:eins
Hinter diesem Label können Sie jetzt entsprechend auf den Errorlevel reagieren. Hierzu zeige ich Ihnen nun ein Batch-Skript, welches den Rückgabewert von unserem Programm exit_code.exe auswertet (Kommentare werden mit den Zeichen :: eingeleitet):
:: Programmname: check.bat :: keine Anzeige der Eingabe (auch nicht von echo) @echo off :: Programm starten exit_code.exe :: Errorlevel auswerten if errorlevel 1 goto eins if errorlevel 0 goto null :: Errorlevel 1 :eins echo Fehler: Ende-Status ist 1 goto ende :null echo Alles Ok: Ende-Status ist 0 goto ende :ende PAUSE
Durch die Verwendung von PAUSE am Ende können Sie die Batch-Datei check.bat auch per Mausklick starten, vorausgesetzt, das Programm exit_code.exe und das Batch-Skript befinden sich im selben Verzeichnis. Hier sehen Sie das Batch-Skript (per Mausklick) bei der Ausführung:
Bitte Eingabe machen : x Fehler bei scanf()-Eingabe Fehler: Ende-Status ist 1 Drücken Sie eine beliebige Taste . . . Bitte Eingabe machen : 5 Alles Ok: Ende-Status ist 0 Drücken Sie eine beliebige Taste . . .
Linux/Unix
Bei Linux/Unix gibt es für die Beendigung eines Shellskripts oder Programms, das zuletzt ausgeführt wurde, die automatische Shellvariable $?. Die Bedeutung dieser Variable ist im Grunde dieselbe, wie eben schon bei Errorlevel unter Windows/MS-DOS erwähnt wurde. Selbst die Erstellung des Shellskripts dafür gestaltet sich recht ähnlich – nur dass die Shell von Linux/Unix schon um einiges mächtiger ist.
Hinweis |
Wollen Sie mehr über die Shell-Programmierung unter Linux/Unix erfahren, kann ich Ihnen *hüstel* mein Buch »Shell-Programmierung. Das umfassende Handbuch« empfehlen, das ebenfalls beim Rheinwerk Verlag erschienen ist. |
Das Shellskript sieht wie folgt aus:
# Rückgabewert Überprüfen # Name: check.sh # Programm starten ./exit_code # Rückgabewert in ret ret=$? # Rückgabewert: 0 if [ ret -eq 0 ] then echo "Alles Ok: Rückgabewert war 0" fi # Rückgabewert: 1 if [ ret -eq 1 ] then echo "Fehler: Rückgabewert war 1" fi
Dieses Shellskript muss nur noch ausführbar gemacht werden. Das Programm sieht bei der Ausführung so aus (hier wird auch davon ausgegangen, dass sich das Shellskript check.sh im selben Verzeichnis wie das auszuführende Programm befindet):
$ chmod u+x check.sh $ ./check.sh Bitte Eingabe machen : x Fehler bei scanf()-Eingabe Fehler: Rückgabewert war 1 $ ./check.sh Bitte Eingabe machen : 5 Alles Ok: Rückgabewert war 0
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.