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

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

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

Beitrag von naums » So Aug 03, 2014 4:53 pm

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
.globl truth
truth:
mov r0, #42
mov pc, lr

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

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

Beitrag von mfro » So Aug 03, 2014 7:19 pm

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.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

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

Beitrag von naums » So Aug 03, 2014 8:33 pm

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
.globl truth
truth:
mov r0, #42
mov pc, lr

Antworten