Problem mit signal



  • Hallo,

    Ich programmiere grade einen Daemon in C++ und hab für das Daemon Handling eine eigene Klasse gebaut, die folgendermaßen aussieht:

    class Daemon
    {
    public:
    Daemon(); // Konstruktor
    ~Daemon(); // Destruktor
    
    private:
    void Daemonize(void);
    void Signal_Handler(int sig);
    };
    

    im Konstruktor wird die Daemonize Methode direkt aufgerufen...

    Num zum Problem. Die Methode Signal_Handler sieht folgendermaßen aus:

    void Daemon::Signal_Handler(int sig)
    {
    switch(sig)
    {
    case SIGHUP:
    log_message(LOG_FILE, "hangup signal catched";
    break;
    case SIGTERM:
    log_message(LOG_FILE, "terminate signal catched";
    exit(0);
    break;
    }
    }
    

    und wird aus der Daemonize Methode folgendermaßen aufgerufen:

    signal(SIGHUP, this->Signal_Handler);
    signal(SIGTERM, this->Signal_Handler);
    

    Mit einfachen funktionen hat das auch so funktioniert, aber seit ich das in eine Klasse eingebaut hab, gibt der Compiler immer folgende Fehlermeldung aus:

    bla:/projekt # g++ -ansi -pedantic-errors -Wall -o statd ./projekt/statd.cpp
    compiling C++ using -ansi -pedantic-errors -Wall -o statd
    In file included from projekt/statd.hpp:15,
    from projekt/statd.cpp:1:
    projekt/includes/daemon.cpp: In member function void Daemon:aemonize()': projekt/includes/daemon.cpp:88: error: argument of typevoid (Daemon:(int)'
    does not match void (*)(int)' projekt/includes/daemon.cpp:89: error: argument of typevoid (Daemon:(int)'
    does not match `void (*)(int)'

    Ich hab so dunkel eine Ahnung was da falsch läuft, aber keine Idee wie ich das fixen kann... Hat jemand von euch eine Idee?

    Herzlichen Dank für den geretteten Abend...

    Dryas

    [edit]Code-Tags gesetzt[/edit]



  • hi,

    deine signal_handler funktion ist eine memberfunktion also
    vom typ: void klasse::f( int ).
    mit anderen worten: die signal_handler funktion ist "nicht alleine
    gültig", sie braucht immer ein dazugehoeriges objekt
    (mal ganz grob ausgedrueckt).

    du musst die signal_handler funktion entweder innerhalb deiner klasse
    statisch machen oder global.

    desweiteren wuerde ich dir raten "zuverlaessige" signal zu benutzen.
    schau dir mal sigaction an.


Anmelden zum Antworten