====== 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