Frage

Ich schreibe einen sehr einfachen Server, der für immer Schleife, bis Strg-C gedrückt wird. Ich mag die Signal-Handler haben für ctrl-c die offenen Sockets schließen und den Server herunterfahren, aber ich weiß nicht, was die Möglichkeiten für einen Signal-Handler ist, und ich weiß nicht, wie die Idee, die Fassung zu erklären (n) ich müsste schließen global sein.

Kann jemand Vorschläge anbieten? Gibt es eine standardisierte Möglichkeit, dies zu tun?

War es hilfreich?

Lösung

Nun, da Sie Signal-Handler haben, werde ich Sie auf einem Unix-Variante sind zu übernehmen. Wenn ja:

  • eine Buchse mit dem Kern durch die Dateinummer identifiziert, die ein int. Siehe socket(2).
  • Das int gilt für Ihren Prozess
  • Das int für alle Prozesse nach dem Erstellen es gegabelt gültig ist
  • Wenn nicht close-on-exec, es gilt für jeden Prozess Sie exec.

Es ist also durchaus möglich, in der Signal-Handler. Wie Sie Ihre Signal-Handler wissen, welche Nummer zu verwenden, hängt von der Sprache machen Sie in schreiben, die Sie nicht angegeben. Es gibt zwei Ansätze, die in so ziemlich jede Sprache arbeiten

  • Wenn Sie außer close und Ausgang zu tun keine Bereinigung haben, nur Ausfahrt nennen. Oder die Signalwirkung auf Standard gesetzt, der Ausgang ist. Der Kernel wird die Buchsen schließen.
  • Stellen Sie eine Flagge (die in der Regel eine globale irgendeiner Art sein wird), um Ihre Auswahl / Umfrage Schleife zu sagen, zu bereinigen und zu beenden. Den Vorteil, dass Sie müssen nicht darum kümmern, wenn verschiedene Teile des Programms sind sicher von einem Signal-Handler aufrufen.

Andere Tipps

Normalerweise ist es ratsam, nicht etwas viel in einem Signalhandler zu tun; andere als ein Flag gesetzt.

Dann, wenn die Steuerung kehrt zu Ihrer Hauptschleife Sie diesen Flag untersuchen kann, beenden Sie die Schleife, in der Nähe Steckdosen, lief Destruktoren auf Ihren Objekten usw. und Ausfahrt sauber.

Signal-Handler kann fast jederzeit aufgerufen werden, auch in der Mitte von C oder C ++ Bibliothek Anrufen, was ein Problem sein könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top