Signalbehandlung und c++



  • Ich fange die Signale Sigchild, Sigquit und Sigint ab. Ich habe ein Programm geschrieben, dass als multiplexing (fork) fähiger Server fungieren soll. Wenn nun eines der oben genannten Signale (außer Sigchild) abgefangen wird, soll der Server sich ordnungsgemäß beenden. Die Signale fange ich schon ab.

    Für diesen Zweck habe ich eine Klasse Server programmiert, die praktisch die ganze Sache regelt. Eine statische Memberfunktion (der Klasse Server) signal_child() fängt alle Signale ab und wertet sie aus. nun will ich, dass von der Instanz der Klasse Server (die im main() angelegt wurde) der Destruktor gerufen wird. Dies funktioniert aber nur bei normaler abarbeitung des Programmes (also ohne Signalsendung). Wenn ich ein Signal sende, dann terminiert er sofort, ohne den Destruktor zu rufen.

    Im Destruktor baue ich alle Ressourcen schön ab (MessageQueue zu den Clients, TCP Verbindungen usw.).

    In der Funktion signal_child() rufe ich, wenn Sigquit oder Sigint kommt, exit(0) auf, was muss ich also vor diese Funktion (exit(0)) schreiben, um den Destruktor der Klasse Server (für die im main() erzeugte Instanz) zu rufen. Ich habe es schon mit einer globalen Instanz als Pointer versucht, und dann mit delete s; vor exit(0) den Destruktor zu rufen, jedoch ohne erfolg. Ich weiß ganz sicher, dass der Destruktor nicht gerufen wird, da bei normaler Ausführung alle Ressourcen abgebaut werden, jedoch nicht bei einem Signal (und ich im Destruktor eine Message ausgebe, die bei einem Signal nicht angezeigt wird).



  • In C++ sollte man auf gar keinen Fall die Funktion 'exit' benutzen.



  • Welche Funktion soll man statdessen ( anstelle von exit) benutzen?



  • Gar keine Funktion. Man lässt das Programm einfach über die main-Funktion auslaufen.



  • ich blockiere aber main mit accept() bzw. select()



  • ich blockiere aber main mit accept() bzw. select()



  • Ich glaube das erledigt man indem man noch ein Dummy Socket oder Pipe in die Filedescriptor-Menge einfügt. Wenn man dieses Objekt schließt wird select zurückkehren.



  • soll ich diesen FDS unter listenfds, exceptionfds bei select geben? ich lege diesen fds einfach mit der funktion socket() an (ich hole mir vom bs einen socket). geht das auf diese weise?



  • man 2 select
    [EINTR]       A signal was delivered before the time limit expired and
                     before any of the selected events occurred.
    

    Nach jedem Signal sollte select() mit -1 zurückkehren und errno auf EINTR gesetzt sein.



  • hinweis schrieb:

    In C++ sollte man auf gar keinen Fall die Funktion 'exit' benutzen.

    Warum?



  • tyho schrieb:

    hinweis schrieb:

    In C++ sollte man auf gar keinen Fall die Funktion 'exit' benutzen.

    Warum?

    Weil keine Destruktoren aufgerufen werden.


Anmelden zum Antworten