Seite 1 von 1

C: AtExit - wird das bei STRG+C gerufen?

Verfasst: So Aug 03, 2014 4:53 pm
von naums
Hallo.

Ich habe ein Programm, was viel Speicher aufsaugt und für seine Lebenszeit behalten soll. (irgendwo im Programm steht ein while ( true ) { ... }.

Wenn ich das Programm mittels [strg]+[c] beende, wird dann die per atexit mitgeteilte Funktion aufgerufen? Wenn nicht, wie kann ich erreichen, dass diese Funktion IMMER, also bei jedem Beenden des Programms gerufen wird?

Beispielcode:

Code: Alles auswählen


void* bla ()
{

}

void main ()
{
    atexit(bla);

    while (true) { ... };
}
MfG

Re: C: AtExit - wird das bei STRG+C gerufen?

Verfasst: So Aug 03, 2014 7:19 pm
von mfro
Bei "richtigen Betriebssystemen" erzeugt ^C üblicherweise einen SIGINT, für den Du per signal() einen Signalhandler anmelden kannst.

Tust Du das nicht, wird stattdessen der "Standard-Signalhandler" der C-Library gerufen, der einfach nur das Programm terminiert (_normalerweise_ werden die per atexit() angemeldeten Handler dabei nicht aufgerufen).

Per atexit() angemeldete Routinen werden üblicherweise nur gerufen, wenn das Ende von main() erreicht ist oder exit() aufgerufen wird.

Warum willst Du ^C abfangen? Wenn's dir nur um die Speicherfreigabe geht, kannst Du dir das sparen - das erledigt das Betriebssystem für dich effizienter.

Re: C: AtExit - wird das bei STRG+C gerufen?

Verfasst: So Aug 03, 2014 8:33 pm
von naums
Hallo.

Vielen Dank für den Hinweis mit Signal, das werde ich mir mal anlesen.

Es geht dabei nicht nur, aber auch um Speicherfreigabe. Einerseits will ich natürlich, das bei valgrind dasteht, dass der gesamte Speicher ordentlich freigegeben wurde, anderseits geht es auch darum, dass alle Threads beendet werden und die Semaphores aufgeräumt werden - ja das geht auch effizienter durch das Betriebssystem - dennoch will ich das gern ordentlich machen.

Edit: Eine Anmerkung habe ich noch dazu: Die manpage von Linux besagt, dass signal() veraltet ist, und nicht mehr benutzt werden sollte, sondern sigaction().

MfG