====== Code-Beispiele für die Signalbehandlung in C-/C++-Programmen ======
===== Ein Beispiel (C-Programm) =====
Im Text (am Anfang):
#include
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 [[EDV:OS:UNIX:Signale]] (nur UNIX/Linux).
----
Stand: 04.08.2016\\
--- //[[feedback.jk-wiki@kreick.de|: Jürgen Kreick]]//
EOF