====== 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()]]