S
speed2006 schrieb:
hallo Liber C/C++ user,
hier mal wieder ein Problem und zwar weiss ich was der unterschied zw. ein exit() _exit() und return 0 ist leider aber nicht wofür man den Integer parameter für exit() im bereich 0 bis 255 eingeben kann?
was ist der unterschied zw. exit(20); und exit(30); ich hab es ausprobiert und muss ehrlich sagen, dass sich nichts ändert. Naja aber warum wohl dann ?
Ach der int main () mache ich immer mit exit(0) zu am Ende geht es auch mit anderen Parameter ?
Hoffe auf einen Antwort von den experten
LG
speeder
Ein Programm hat beim Verlassen zwei Möglichkeiten: mit oder ohne Fehler (im Sinne vom Absturz oder Fehlverhalten). Damit man erkennen kann, ob ein Prozess fehlerhaft oder fehlerfrei beendet hat, liefern die Prozesse beim Beenden eine zahl zurück. 0 wenn fehlerfrei, eine Zahl != 0 sonst, dabei ist es im Prinzip egal, was man liefert, ob 1 oder 10 oder 100, das ist im Prinzip egal. Aber wenn man verschiedene Werte hat, so kann man sie dafür benutzen, die verschiedene Fehlermöglichkeiten abzufangen. Dabei hält man sich meistens an der man: errno Konvention.
Was den Unterschieden zwischen return xxx, exit(xxx), _exit(xxx) angeht: ein return xxx; in int main(); ist äquivalent zu einem exit(xxx).
exit und _exit unterscheiden sich darin, dass exit Aufräumarbeit betätigt während _exit keine Aufräumt Arbeit erledigt. Um zu verstehen, was das bedeutet, musst du ungefähr wissen, wie Linux (also der Kern) Prozesse startet.
Wenn du ein Programm starten willst, gibst du in einem Terminal den Pfad und Namen der ausführbaren Datei an. Mittels man: exec(3) startet der Kern einen neuen Prozess, der durch eine startup Prozedur initialisiert und gestartet wird. Erst dann wird die Funktion main() ausgeführt und das Programm läuft. Ein Programm ohne einen Aufruf von man: exit(3) beendet, wenn die Funktion main komplett abgearbeitet ist und liefert einen Wert zurück. Die startup Prozedur ruft dann exit mit dem zurückgegebenen Wert auf und diese Funktion macht die Aufräumarbeit, Speicher freigeben, exit_handlers aufrufen, usw. Wenn exit fertig, dann wird man: _exit(2) aufgerufen und beenden den von exec gestarteten Prozess.
Wenn exit währned des Ablaufs des Programms aufgerufen wird, so umgeht das Programm das "Zurückkeheren" an der Startprozedur sondern wird das Aufräumen erledigt, exit_hanlders ausgeführt, usw. Erst dann führt exit die _exit Funktion aus, um den Prozess zu beenden.
Wenn _exit währned des Ablaufs des Programms aufgerufen wird, so wird der der Prozess sofort beendet, ohne aufzuräumen und ohne den exit_handlers ausgeführt zu haben. Mit _exit sollte man aber selber ein Programm nicht beenden.
Wenn du mehr darüber lesen willst, dann du die man pages nach den exec Funktionen suchen (man 3 exec).