2016-05-20 3 views
1

Ich möchte eine Signalverarbeitungsfunktion für mehrere Programme schreiben, die auf verschiedenen Servern laufen, so dass, wenn sie auf Fehler stoßen, z. Segmentierungsfehler SIGSEGV oder SIGTERM usw. kann die Signalverarbeitungsfunktion ein Protokoll erzeugen und den Inhalt auf einen zentralen MYSQL-Server hochladen. Dies dient dazu, den Administrator zu informieren, den einzelnen Server zu identifizieren und das Problem zu beheben. Aus meiner Forschung sollte ich Sigaction oder Exception Handling verwenden.Wenn Programme auf Fehler stoßen, wie in Protokolle schreiben und Protokolle in MYSQL in Signalverarbeitungsfunktionen hochladen?

Q1: Für meinen Zweck, die (Signalbehandlung oder Ausnahmebehandlung) sollte ich verwenden?

Q2: Ich lese, dass es nicht empfohlen wird, nicht-reentranten Funktionen in Signal-Handler-Funktionen z. printf(). Wie könnte ich in diesem Fall eine Protokolldatei erstellen? Kann ich mich sogar mit MYSQL verbinden, um Logs in Signalverarbeitungsfunktionen hochzuladen?

Ich arbeite mit C++ und Linux. Vielen Dank fürs Lesen.

+1

Werfen Sie einen Blick auf die Verwendung/Implementierung von 'syslogd' –

Antwort

0

Sie haben Recht, jedes Programm sollte eigene Reaktionen auf Signale implementieren!

Q1: Verwenden Sie sigaction(), es ist das ausgearbeitete als das ehemalige Signal().

Q2:

  • Signalverarbeitung ist atomar für den gesamten Prozess. Sie können printf() verwenden, wenn Sie sicher sind, dass kein zweiter SIGSEGV erzeugt wird.
  • Mit sigaction reservieren Sie eine kleine Menge von Stack für den Signalhandler. Dieser verbleibende Stack ist nützlich, wenn das Programm in den Stack-Überlauf läuft. Stellen Sie sicher, dass die Aktionen des Signal-Handlers in diesen verbleibenden Stack passen. Das Schreiben einer Protokolldatei mit printf ist OK, aber der Stapel, der von einer Netzwerkbibliothek verwendet wird, steht nicht unter Ihrer Kontrolle.
Verwandte Themen