Hallo an alle,
ich habe folgendes Problem:
Ich habe ein C-Programm, dass an mehreren Stellen durch return/exit beendet werden kann. Ich möchte aber, dass nach dem return noch ein paar Befehle ausgeführt werden, dafür gibt es die atexit-Funktion. Nun benutze ich etwa folgendes Konstrukt:
void Finite(void); char * pTest;
int main(void) { ... atexit(Finite); pTest=malloc(500); ... return -3; }
void Finite(void) { free (pTest); }
Das Programm läuft auch einwandfrei bis zum return, danach komme ich nicht mal mit einem Debugger weiter. Ohne Debugger wird das Programm nicht beendet und hängt.
<Auf Anregungen wartend>
Roland Müller
On Friday 10 May 2002 11:13, Roland Müller wrote:
<Auf Anregungen wartend>
Normalerweise sollte man kein atexit verwenden, denn wenn das Programm ordnungsgemäß beendet wird, kann man auch auf anderem Wege gewisse Sachen aufräumen, für alles andere gibt es Signalhandler.
Warum dein Beispiel nicht funktioniert weiß ich nicht, hier geht es wunderbar, sowohl mit gcc 2.95.4 als auch 3.0.4, und glibc 2.2.5.
Josef Spillner
Hallo Roland,
werden kann. Ich möchte aber, dass nach dem return noch ein paar Befehle ausgeführt werden, dafür gibt es die atexit-Funktion. Nun benutze ich
etwa[...]
Das Programm läuft auch einwandfrei bis zum return, danach komme ich nicht mal mit einem Debugger weiter. Ohne Debugger wird das Programm nicht beendet und hängt.
Wenn ich mich recht erinnern kann, ist der Zustand des ausgeführten Programmes im Exit-Handler nicht eindeutig definiert, d.H. möglicherweise ist (je nach Compiler) der Pointer auf den mit Malloc ausgefassten Speicher schon nicht mehr gültig. Daher könnte folgen, dass Dein Programm hängt. Mit dem GCC muss das aber funktionieren, hab ja in meinem letzten Beleg mit atexit sogar eine Datensicherung durchgeführt. Hast Du schon einmal probiert, mit printf den String auszugeben? (im Exit-Handler)
Matthias
Matthias Petermann wrote:
möglicherweise ist (je nach Compiler) der Pointer auf den mit Malloc ausgefassten Speicher schon nicht mehr gültig.
War extra ein globaler Pointer.
Daher könnte folgen, dass Dein Programm hängt. Mit dem GCC muss das aber funktionieren, hab ja in meinem letzten Beleg mit atexit sogar eine Datensicherung durchgeführt.
Ich weis, das hat mich ja erst auf den Trichter mit dem atexit gebracht.
Hast Du schon einmal probiert, mit printf den String auszugeben? (im Exit-Handler)
Der exit-Handler wird aufgerufen, hängt dann aber. Ich glaube ich muss die Routinen noch mal genauer untersuchen (ist ein bisschen mehr als nur ein free, da ich ja noch meine Liste auflösen muss.
<untersuche> ... (5min) ... </untersuche>
Aha, ich hab es. Ich hatte eine kleine Endlosschleife programmiert. Komisch dass aber der Debugger (gdb) dort nicht mehr durchsieht.
Danke an alle !!!
Roland
On Fri, May 10, 2002 at 11:13:14AM +0200, Roland Müller wrote:
Hallo an alle,
void Finite(void); char * pTest;
int main(void) { ... atexit(Finite); pTest=malloc(500); ... return -3; }
void Finite(void) { free (pTest); }
Bin mir nicht sicher, ob as mit atexit() auch gilt, wenn return am Ende genutzt wird. Return ist eben nicht exit().
... Stop. Gerade im Stevens nachgeschaut, return aus main() kehrt zur startup-Routine von C zurück, die dann exit aufruft, von wo dann erst die (maximal 32) exit-Handler aufgerufen werden und anschließend das I/O-cleanup stattfindet (fclose...).
Best regards from Dresden Viele Gruesse aus Dresden Heiko Schlittermann
Hallo Heiko,
... Stop. Gerade im Stevens nachgeschaut, return aus main() kehrt zur startup-Routine von C zurück, die dann exit aufruft, von wo dann erst die (maximal 32) exit-Handler aufgerufen werden und anschließend das I/O-cleanup stattfindet (fclose...).
Also doch eindeutig definiert... was ist der "Stevens" für ein Buch? (Lohnt sich die Anschaffung)?
Matthias
On Fri, May 10, 2002 at 11:55:51AM +0200, Matthias Petermann wrote:
Hallo Heiko,
... Stop. Gerade im Stevens nachgeschaut, return aus main() kehrt zur startup-Routine von C zurück, die dann exit aufruft, von wo dann erst die (maximal 32) exit-Handler aufgerufen werden und anschließend das I/O-cleanup stattfindet (fclose...).
Also doch eindeutig definiert... was ist der "Stevens" für ein Buch? (Lohnt sich die Anschaffung)?
Advanced Programming in the Unix Environment (oder so ähnlich). Autor ist der selbe, der auch das "TCP/IP Illustrated" gemacht hat.
Wenn ich dran denke, bringe ich's am Mittwoch (ist doch Treff, oder?) mal mit, kannst dann mal reingucken.
Heiko
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On Friday 10 May 2002 21:12, Heiko Schlittermann wrote:
Wenn ich dran denke, bringe ich's am Mittwoch (ist doch Treff, oder?) mal mit, kannst dann mal reingucken.
Ja, falls Du den 22.5. meinst.
Konrad
- -- Ahead warp factor one, Mr. Sulu.
Hallo Heiko,
On Fri, May 10, 2002 at 09:12:32PM +0200, Heiko Schlittermann wrote:
Advanced Programming in the Unix Environment (oder so ähnlich). Autor ist der selbe, der auch das "TCP/IP Illustrated" gemacht hat.
Wenn ich dran denke, bringe ich's am Mittwoch (ist doch Treff, oder?) mal mit, kannst dann mal reingucken.
Laut Konrad ist ja erst übernächste Woche Treffen, wäre aber ganz prima wenn Du das Buch dann mal mitbringen könntest.
Matthias
lug-dd@mailman.schlittermann.de