[gelöst] Signale unter Linux und Windows



  • Hallo,
    ich weiß nicht ob das Thema in diesen Thread gehört, denn es betrifft, Linux, Windows und wxWidgets. Zur Not bitte verschieben.

    Mein Sachverhalt:
    Ich habe unter wxWidgets ein Serverprogramm (und ein Clientprogramm) geschrieben. Es ist eine wxWdigets-Konsolenanwendung. Diese Funktioniert.
    Meine Klasse hat einen Constructor zum reservieren des Ports und einen Desctructor der den Port wieder frei gibt.
    Mit Hilfe der Funktion fork() und der Anleitung "Wie mache ich mein Programm zu Deamon" habe ich nun meinen Programm zum Deamon gemacht. Wenn ich das Programm starte, dann holt sich mein Serverprogramm nun den Port.

    Wenn ich nun unter Linux den Deamon mit kill oder killall beende habe ich nun allerdings das Problem, dass mein Destructor nicht ausgeführt wird. Es stehe am Bildschirm "Beendet", aber der Port ist leider immer noch reserviert.

    Unter Windows habe ich die Problematik noch nicht getestet, aber der Fakt soll sein:
    Egal ob ich unter Windows oder Linux mein Serverprogramm starte, soll das Programm als Hintergrundprozess laufen und wenn ich den Prozess beende, dann soll der Port wieder freigegeben werden (sprich mein Destructor ausgeführt werden für alle möglichen aufräumarbeiten...)

    Leider finde ich aber keine Möglichkeit das Problem zu lösen.

    Hat jemand ein paar Erklärungen oder Hintergrundinfos für mich, wie man so etwas angehen sollte und ob mein erdachter Weg überhaupt der richtige ist?

    Danke,
    Stefan



  • Du kannst die Funktion signal() (definiert im Header <csignal>) benutzen, um die von kill gesendeten Signale abzufangen. Das heißt du registrierst einen Signal-Handler, der dann im Falle eines SIGTERM (o.ä.) aufgerufen wird, und dein Programm sauber aufräumen kann.
    Ggf. macht es Sinn, neben SIGTERM (das von kill standardmäßig gesendet wird) auch noch SIGINT, SIGHUP u.a. abzufangen.

    Ich erinnere mich dunkel, daß die Signale die man abfangen sollte unter Windows etwas andere waren, aber im Prinzip sollte es da genauso funktionieren.



  • Hallo,

    danke für deine Hilfe. Im Buch "Linux-UNIX Programmierung" von Jürgen Wolf gibt es einen großes Artikel über Signale. Mit Hilfe von diesem Kapitel habe ich es unter Linux schon mal geschafft die Signale abzufangen. Jetzt muss ich nur noch darauf reagieren. Das sollte aber das kleinste Problem sein.

    Ich habe versucht die ganze Sache auf Windows zu übertragen, aber leider klappt das nicht ganz. Meist bekomme ich falsche Linker. Also muss ich wohl noch meine Visual Studio Einstellungen prüfen.

    Stefan


Anmelden zum Antworten