====== signal() ======
signal() ist definiert in der ''[[start|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 [[c:lib:posix:sigaction|sigaction]] verwendet werden.
===== Funktion =====
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 );
===== Signatur =====
#include
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 [[c:lib:stdlib:abort|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 |
===== Beispiel =====
Folgendes Beispiel setzt einen Signal-Handler für Strg-C:
#include
#include
#include
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.
===== siehe auch =====
[[start|signal-Library]]: [[raise|raise()]]