signalhaendler/atexit-Konformitaet

26/04/2010 - 15:44 von Curtis Newton | Report spam
Hallo,

ich möchte in meinem Programm CTRL-C abfangen und kontrolliert mein
Programm beenden. Dazu habe ich einen Signalhàndler installiert. Klappt.

Ich habe etlich Hardwarekomponenten offen, für die ich jeweils
C++-Klassen geschrieben habe. Hier werden ja bei einem CTRL-C die
Destruktoren nicht aufgerufen (soweit ich gesehen habe).

Meine Idee ist nun folgende: Ich füge der Hardware-Klasse eine
statische Funktion void cleanup(void) hinzu. Auch merke ich mir in
einer globalen Variable, ob ein Device geöffnet ist. Ungefàhr so:

HWDEV.h:
-

class HWDEV
{
public:
int init();
int Free();

static void cleanup(void);
}

HWDEV.cpp:


HWDEV *g_dev; //es gibt nur eine HW im System, deswegen reicht ein Zeiger

HWDEV::init()
{
g_dev=this;
...
}

HWDEV::Free()
{
...
g_dev=0;
}

void HWDEV::cleanup()
{
if(g_dev) g_dev->Free();
}

Jetzt habe ich für die cleanup-Funktion einen atexit-Hàndler
hinzugefügt. Es klappt soweit auch alles, was ich will. Außer mit
dem "Schönheitsfehler", dass das Programm abstürzt (SegFault), wenn
CTRL-C genau dann gemacht wird, wenn HWDEV gerade in einer Funktion ist.
Daher meine Fragen:
1. Wird das überhaupt so gemacht? Geht das besser?
2. Wie kann ich das mit dem segfault lösen?

Danke!

Bye
 

Lesen sie die antworten

#1 Curtis Newton
26/04/2010 - 16:28 | Warnen spam
Am Mon, 26 Apr 2010 15:44:06 +0200 schrieb Curtis Newton:

2. Wie kann ich das mit dem segfault lösen?



Ich habe jetzt ein Mutex genutzt und jede Funktion damit geschützt.
Gleichzeitig für den Mutex PTHREAD_MUTEX_RECURSIVE gesetzt, damit
rekursiver Funktionsaufruf in einem Thread möglich ist. In den
signalhàndler-Thread wirds dann halt geblockt, solange bis im anderen
Thread die Funktion beendet ist.

C.
Bye

Ähnliche fragen