Benutzer-Werkzeuge

Webseiten-Werkzeuge


edv:prg:c:example:signalbehandlung

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

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

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki