C++ und Signalhandler in einer Klasse



  • Hallo Community,

    ich hab da ein kleines Problem.
    Ich habe eine kleine Serveranwendung mit C++ programmiert und hab in einer main.cpp den Server angelegt und betrieben. Das klappt auch soweit alles ohne Probleme.
    Nun wollte ich aber einen Signalhandler intergrieren.

    void TimerManager::prepareTerminate(int s)
    {
        cout << "Shutting down TIMERSERVER...." << endl;
        shutdown = 1;
        // tlist.remainingRuntime();
    }
    

    Dieser Signalhandler soll mir nur die Variable verändern, sodass der Server nicht einfach gekillt wird, sondern noch Funktionen aufrufen kann und ihn dann "sanft" beendet.

    Ich möchte aber im Signalhandler noch gern eine Methode aufrufen, die aber von meinem Server ist. Das geht nicht, weil "tlist" in der main deklariert wurde und nicht global ist (und das soll auch so bleiben).

    Meine Frage:
    Wie baue ich nun den Signalhandler in meine Klasse mit ein? Ich krieg nämlich Fehler, wenn ich das Ding einfach so in meine Klasse einbaue.

    main.cpp

    int main(int argc, char *argv[])
    {
        // Creating list of Timer
        TimerManager tlist;
    
        // SIGNAL-Handler
        signal(SIGTERM, tlist.prepareTerminate);	// Signalhandler for SIGTERM
        signal(SIGINT,  tlist.prepareTerminate);	// Signalhandler for SIGINT
    
    ... usw ....
    

    timermanager.h

    void TimerManager::prepareTerminate(int s)
    {
        cout << "Shutting down TIMERSERVER...." << endl;
        shutdown = 1;
    }
    

    Folgenden Fehler bekomme ich dann beim compilieren:

    ./server/src/main.cpp: In function `int main(int, char**)':
    ./server/src/main.cpp:21: error: argument of type `void (TimerManager::)(int)' does not match `void (*)(int)'
    ./server/src/main.cpp:22: error: argument of type `void (TimerManager::)(int)' does not match `void (*)(int)'
    

    Sollte doch irgendwie machbar sein, den Signalhandler in eine Klasse aufzunehmen. Wäre nett, wenn mir jemand weiterhelfen könnte.

    Grüße Samptron



  • die memberfunktion muss static sein



  • ./server/src/timermanager.cpp:219: error: cannot declare member function `static void TimerManager::prepareTerminate(int)' to have static linkage
    ./server/src/timermanager.cpp: In static member function `static void TimerManager::prepareTerminate(int)':
    ./server/src/../inc/timermanager.h:60: error: invalid use of member `TimerManager::shutdown' in static member function
    

    Außerdem iss doch komplett sinnlos, die Funktion als static zu deklarieren. Ich habe doch nur eine Serverinstanz.



  • Außerdem iss doch komplett sinnlos, die Funktion als static zu deklarieren. Ich habe doch nur eine Serverinstanz.

    anders gehts aber nicht.



  • signal() stammt aus C und funktioniert deshalb nicht mit Methodenzeigern - sondern nur mit "normalen" Funktionen und statischen Methoden (das hängt vor allem damit zusammen, daß C keine Ahnung hat, was es als this an eine Methode übergeben kann). Und in einer statischen Methode kannst du nur auf statische Klassenmember direkt zugreifen - wenn du also tatsächlich eine konkrete Instanz benötigst, mußt du sie auf anderem Weg erreichen (Stichwort: Singleton).


Anmelden zum Antworten