signal() ist definiert in der signal
, die in C über signal.h
, bzw. in C++ über csignal
eingebunden wird.
Achtung: Es wird aus Portabilitätsgründen strengstens von signal()
abgeraten, stattdessen sollte die POSIX-Funktion sigaction verwendet werden.
signal() definiert eine Funktion, die ein bestimmtes Signal behandelt.
Dabei wird ein Makro übergeben, das die Art des Signals angibt und eine Funktion die das jeweilige Signal behandelt:
signal( SIGINT, &sigIntHandler );
#include <signal.h> void ( *signal( int sig, void ( *func )( int ) ) )( int );
sig: Das zu behandelnde Signal
Rückgabewert: Ein Funktionszeiger auf die zuvor gesetzte Handler-Funktion für sig
. Bei einem Fehler wird SIG_ERR
zurück gegeben.
Für sig
stehen dabei folgende Makros zur Verfügung:
Name | Signal | Bedeutung |
---|---|---|
SIGABRT | Abort | Wird durch abort() ausgelöst |
SIGFPE | Floating-Point Exception | Ungültigen Berechnung (z.B. Division durch 0) |
SIGILL | Illegal Instruction | Fehler bei der Programmausführung |
SIGINT | Interrupt | Wird ausgelöst, wenn das Programm gestoppt werden soll (z.B. durch Strg+C) |
SIGSEGV | Segmentation Violation | Speicherzugriffsfehler |
SIGTERM | Terminate | Programm soll beendet werden |
func
muss dabei folgende Signatur haben:
void handler( int parameter );
Alternativ stehen folgende Funktionen zur Verfügung:
Handler | Funktion |
---|---|
SIG_DFL | Standard-Handler |
SIG_IGN | Signal wird ignoriert |
Folgendes Beispiel setzt einen Signal-Handler für Strg-C:
#include <stdio.h> #include <stdlib.h> #include <signal.h> void handleSigInt( int parameter ); int main() { signal( SIGINT, &handleSigInt ); while( 1 ) getchar(); return 0; } void handleSigInt( int parameter ) { printf( "\nSIGINT wurde augeloest - Programm wird beendet\n" ); exit( 1 ); }
Ausgabe:
$ ./signal a b c d e ^C SIGINT wurde augeloest - Programm wird beendet $
Strg+C bricht in diesem Fall die Ausführung nicht automatisch ab. Es wird nur die festgelegte Funktion aufgerufen, die dann eine Ausgabe vornimmt und das Programm manuell beendet.