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?
Nun, da Sie Signalhandler haben, gehe ich davon aus, dass Sie eine Unix-Variante haben. Wenn ja:
socket(2)
. 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.
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. 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.