edv:prg:c:example:signalbehandlung
Inhaltsverzeichnis
Code-Beispiele für die Signalbehandlung in C-/C++-Programmen
Ein Beispiel (C-Programm)
Im Text (am Anfang):
#include <signal.h> static int Signal = FALSE; // aktuelles Signal global speichern // Semaphoren, die während Signalbehandlung beachtet werden sollen static int switchTraceFile = FALSE; static int switchTerminate = FALSE;
In main() (irgendwo am Anfang) den SignalHandler einrichten/zuweisen:
signal(SIGTERM, SigHandler); // Signal SIGTERM durch SigHandler() abfangen signal(USER1, SigHandler); // Signal USER1 durch SigHandler() abfangen signal(SIGCHLD, SIG_IGN); // Signal SIGCHLD ignorieren
Danach an mehreren Stellen im Text (vorzugsweise in den Schleifen) auf Vorhandensein eines Signals überprüfen und Bearbeitung des Signals vornehmen:
if (Signal) { rc = SigBehandlung(ec); }
Bearbeitung des Signals selbst (darf etwas umfangreicher sein):
static int SigBehandlung (int *ec) { int rc = RC_OK; ASSERT((ec != NULL)); *ec = EC_OK; if (rc == RC_OK) { Signal = FALSE; // vor Doppelverarbeitung schützen } if (rc == RC_OK) { if (switchTraceFile) { // Hier wird was gemacht... switchTraceFile = FALSE; // Semaphore zurücksetzen rc = RC_OK; } } if (rc == RC_OK) { if (switchTerminate) // Hier wird das Programm zwangsweise beendet... { // Funktion anmelden, die beim Beenden das Aufräumen vornimmt atexit(ExitServerEnde); exit(0); } } return rc; } // SigBehandlung()
SignalHandler selbst (zeitkritisch - darf nicht zu umfangreich sein) wird durch das Betriebssystem aufgerufen:
static void SigHandler(int sig) { fflush(stdout); fflush(stderr); LOG("SigHandler Enter"); fprintf(stderr, "Signal [%d] empfangen\n", sig); Signal = sig; // global speichern: es gab einen Interrupt Request switch (sig) // Aktivitäten während des SignalHandlers { case SIGTERM: fprintf(stderr, "SIGTERM: Prozeß soll demnächst beendet werden\n"); break; default: break; } fflush(stderr); LOG("SigHandler Exit"); } // SigHandler()
Weitere Beispiele
- C++ Signal Handling: http://www.tutorialspoint.com/cplusplus/cpp_signal_handling.htm (Mit Kurzbeschreibung der signal() und raise() Funktionen.)
- Signal-Handler + die Klasse "SignalException": http://www.yolinux.com/TUTORIALS/C++Signals.html
Hier geht es zur Beschreibung einzelne Signale (nur UNIX/Linux).
Stand: 04.08.2016
— : Jürgen Kreick
EOF
edv/prg/c/example/signalbehandlung.txt · Zuletzt geändert: 2020/01/11 01:23 von 127.0.0.1