[C] Am Ende "return" oder "exit"?

plex84

Grünschnabel
Vermutlich eine ganz einfach zu beantwortende Frage, aber:

Sollte ich am Ende von main() "return" oder "exit" verwenden? Ich habe in den Manualseiten zu exit(3) (Linux und OpenBSD) gelesen, dass exit(3) zuerst noch "aufräumt", bevor es das Programm beendet (offene Dateideskriptoren, etc.).

Auf der anderen Seite habe ich gelesen, dass return und exit am Ende von main() das gleiche machen. Bin jetzt ein wenig verwirrt, da ich unter OpenBSD dieses Verhalten getestet habe. Ich habe dabei folgende Programme genutzt:

Code:
int
main(int argc, char *argv[])
{
    return 0;
}

und

Code:
#include <stdlib.h>

int
main(int argc, char *argv[])
{
    exit(0);
}

Das ganze habe ich dann mit "gcc -S exit.c" und "gcc -S return.c" in Assembler übersetzen lassen. Das Resultat war, dass es nicht der gleiche Code war, wie man annehmen müsste:

"exit" hat die Stackprotection abgebrochen und hat das Programm sofort beendet, während "return" dafür sorgte, dass die Stackprotection die abschließende Überprüfung durchgeführt hat.

Daher weiß ich nun überhaupt nicht weiter, wann ich exit(3) und wann ich return nutzen sollte. Ich hoffe, ihr könnt mir weiterhelfen.
 
Wie Du schon selber festgestellt hast, ist es immer sauberer, das Programm mit 'return' aus der main-Funktion zu verlassen (So wie es in jeder Funktion sauberer ist, sie nur am Ende mit 'return' zu verlassen und nicht irgendwo zwischendrin). 'exit' würde ich, wenn überhaupt, nur in kleinen, überschaubaren Programmen verwenden, wenn irgendwo ein Fehler aufgetreten ist, der das Programm am Weiterarbeiten hindert.
 
moin


Also return 0; ist die bessere Wahl, da mit exit das Programm sofort abgebrochen wird.
Es wird kein reservierter Speicher mehr freigegeben und nichts geschlossen, exit ist also sehr "unsauber".

Das hast du bei return nicht.


mfg
umbrasaxum
 
umbrasaxum hat gesagt.:
moin


Also return 0; ist die bessere Wahl, da mit exit das Programm sofort abgebrochen wird.
Es wird kein reservierter Speicher mehr freigegeben und nichts geschlossen, exit ist also sehr "unsauber".

Das hast du bei return nicht.


mfg
umbrasaxum


Vollkommen zustimmt !
 
Ich habe mal auf der tech-Mailingliste nachgefragt, dort wurde gesagt, dass
für OpenBSD exit() bevorzugt wäre, da nach dem return dieses exit() sowieso
aufgerufen wird. Jetzt kann das natürlich von System zu System unterschiedlich
sein, ich habe mich noch nicht so um das "Drumherum" eines C-Programmes
beschäftigt... Kann mir einer sagen, wie das unter Windows gehandhabt wird?
Oder Linux, oder Mac OS, oder ... :)
 
Zurück