C++ "atexit()" immer ausführen

Squicky

Lt. Commander
Registriert
Sep. 2002
Beiträge
1.405
Hallo

Bei C/C++ gibt es die atexit(aufraeumen) Funktion, mit der man eine Funktion angeben kann, die beim Beenden des Programms ausgeführt wird. Bei mir wird eine Funktion gestartet um Verbindungen und Threads richtig zu beenden.

Wenn das Programm (z.B. ein Thread) selber einen Fehler merkt und sich mit der exit() Funktion beendet, dann wir die "aufraeum" Funktion gestartet.
Wenn das Programm aber von außen (z.B. Debugger/NetBeans oder Systemüberwachung) beendet wird, dann wird diese Funktion nicht ausgeführt.

Gibt es eine Möglichkeit, dass diese Funktion immer beim beenden ausgeführt wird? (Egal woher das der exit Befehl kommt.)


Danke

P.S. Falls wichtig: Es ist Linux.
 
Signal Handler installieren. Dein Programm bekommt einen Event vom Betriebssystem wenn es sich beenden soll. Wenn das Programm nicht reagiert (so beschreibt es windows) kann es auch ohne diesen Event-Handler beendet werden.

Edit: Bei Linux ist es ein kill -9, der keinen sauberen Event erzeugt.
 
Ist dir bewußt, daß wenn du das Programm mit exit() verläßt, die Destruktoren aller Objekte auf dem Stack NICHT ausgeführt werden? Wenn diese Destruktoren irgend was für deinen Anwendungsfall wichtiges tun ... dumm gelaufen.

Ich meine, der sauberere Weg, ein Programm zu beenden, wäre einfach aus der main()-Funktion normal zurückzukehren. Aufräumarbeiten kannst du doch auch ohne eine spezielle exit-Funktion vornehmen. Stark vereinfachtes Beispiel:

Code:
class CleanupGuard
{
public:
	~CleanupGuard()
	{
		// hier Aufräumarbeiten implementieren
		// ...
	}
};

int someThreadFunction( void* arg )
{
	// cleanup guard auf dem stack erstellen ... wird die Funktion verlassen (sei es per return oder exception),
	// wird Destruktor ausgeführt und aufgeräumt
	CleanupGuard g;
	
	// ...
	
	
	return 0;
}
 
Zuletzt bearbeitet:
Zurück
Oben