Wie soll ich einen Socket in einem Signalhandler schließen?

8

Ich schreibe einen sehr einfachen Server, der für immer eine Schleife ausführt, bis Strg-C gedrückt wird. Ich möchte, dass der Signalhandler für ctrl-c die geöffneten Sockets schließt und den Server herunterfährt, aber ich weiß nicht, was der Bereich für einen Signal-Handler ist, und ich mag die Idee nicht, den Socket zu deklarieren (s) Ich müsste schließen, um global zu sein.

Kann jemand Vorschläge machen? Gibt es einen Standard-Weg, dies zu tun?

    
Zxaos 16.01.2009, 05:48
quelle

2 Antworten

7

Nun, da Sie Signalhandler haben, gehe ich davon aus, dass Sie eine Unix-Variante haben. Wenn ja:

  • Ein Socket ist für den Kernel durch die Dateinummer identifiziert, die ein int ist. Siehe socket(2) .
  • Dieser int gilt für Ihren Prozess
  • Dieser Int gilt für alle Prozesse, die nach dem Erstellen verzweigt wurden
  • Wenn nicht close-on-exec, gilt es für jeden Prozess, den Sie ausführen.

Also ist es in Ihrem Signal-Handler absolut gültig. Wie Sie Ihren Signal-Handler über die zu verwendende Nummer informieren, hängt von der Sprache ab, in der Sie schreiben, die Sie nicht angegeben haben. Es gibt zwei Ansätze, die in fast jeder Sprache funktionieren.

  • Wenn Sie keine Bereinigung außer close und exit vornehmen müssen, rufen Sie exit einfach auf. Oder setzen Sie die Signalaktion auf den Standardwert, dh auf exit. Der Kernel schließt die Sockets.
  • Setzen Sie eine Markierung (die in der Regel eine globale Art sein soll), um Ihrer Select / Poll-Schleife mitzuteilen, dass sie bereinigt und beendet werden soll. Vorteilhaft darin, dass Sie sich keine Gedanken darüber machen müssen, ob verschiedene Teile Ihres Programms sicher von einem Signal-Handler aus aufgerufen werden können.
derobert 16.01.2009, 06:04
quelle
7

Normalerweise ist es ratsam, in einem Signal-Handler nicht viel zu tun; andere als eine Flagge setzen.

Wenn die Steuerung zu Ihrer Hauptschleife zurückkehrt, können Sie dieses Flag überprüfen, die Schleife beenden, Sockets schließen, Destruktoren für Ihre Objekte usw. ausführen und sauber beenden.

Signalhandler können fast jederzeit aufgerufen werden, auch in der Mitte von C- oder C ++ - Bibliotheksaufrufen, was ein Problem sein könnte.

    
MarkR 16.01.2009 07:02
quelle

Tags und Links