2017-07-07 5 views
0

Ich verwende eine Fix-Initiator-Anwendung, die in C++ auf der Solaris X86-Plattform codiert ist. Um die Anwendung auf einer regulären Basis zu starten und zu stoppen, benutze ich einen Shell-Skript-Wrapper und Cron, der zum Beenden einen Kill auf die PID der Anwendung ausführt. Ich frage mich, ob es eine elegantere und "professionellere" Art und Weise gibt, den Initiator zu stoppen, weil Kill sofort den gesamten Prozess ohne eine ordnungsgemäße Abmeldung auf den Fix-Sitzungen, trennt auf den Sockets, löschen Dateigriffe, etc ..So stoppen Sie einen Quickfix-Initiator

Können Sie bitte einen Rat geben oder ein Beispiel geben, wie Sie mit dem SIGINT in der Fix-Anwendung umgehen können?

Antwort

1

Werfen Sie einen Blick auf sigaction, das ist, was Sie tatsächlich brauchen. Ein Beispiel zur Verwendung finden Sie here - sicher, C, aber auch in C++ anwendbar ...

Wenn Sie entdecken signal einfacher zu handhaben (Wahrheit ...): Nun, vermeiden Sie es (siehe Link. ..).

Beachten Sie, dass Abtötung von Standard SIGTERM sendet, so ist dies, was Sie sollten eigentlich fangen ...

Beachten Sie auch, dass aus mit Signal-Handler, Sie async sichere Funktionen verwenden nur erlaubt! Eine Liste von ist enthalten in here

Ich nehme an, Ihr Programm läuft innerhalb einer Schleife. Um Probleme mit nicht-async-sicheren Funktionen zu vermeiden, sollten Sie möglicherweise nur eine Schleifenbedingung im Signal-Handler zurücksetzen und den Rest erneut mit dem Haupt-Thread behandeln (aus der Schleife ausbrechen und danach aufräumen).

Wenn Sie sich auf das Blockieren von IO verlassen, können Sie jedoch einen Anruf an select oder poll (falls noch nicht so getan), die Überprüfung der IO-Griffe vor dem Lesen. Sie können einen zusätzlichen Datei-Deskriptor hinzufügen, den Sie vom Signal-Handler aktivieren, um die Auswahl/Abfrage vorzeitig unterbrechen zu können.

Eine solche zusätzliche Datei-Handler können Sie mit eventfd, die jedoch Linux-spezifisch ist, oder auf eine tragbare Art und Weise durch Öffnen einer Pipe und Schreiben von innerhalb der Signal-Handler.