signal
| Definiert im Header <signal.h> |
||
| void (*signal( int sig, void (*handler) (int))) (int); |
||
Setzt die Fehlerbehandlungsroutine für das Signal sig. Der Signalhandler kann so eingestellt werden, dass die Standardbehandlung erfolgt, das Signal ignoriert wird oder eine benutzerdefinierte Funktion aufgerufen wird.
Wenn der Signalhandler auf eine Funktion gesetzt wird und ein Signal auftritt, ist es implementierungsabhängig, ob signal(sig, SIG_DFL) unmittelbar vor Beginn des Signalhandlers ausgeführt wird. Außerdem kann die Implementierung verhindern, dass eine implementierungsabhängige Menge von Signalen auftritt, während der Signalhandler läuft.
Inhalt |
[bearbeiten] Parameter
| sig | - | Das Signal, für das der Signalhandler gesetzt werden soll. Dies kann ein implementierungsabhängiger Wert oder einer der folgenden Werte sein
| ||||||
| handler | - | Der Signalhandler. Dies muss einer der folgenden sein
|
[bearbeiten] Rückgabewert
Der vorherige Signalhandler im Erfolgsfall oder SIG_ERR im Fehlerfall (das Setzen eines Signalhandlers kann in einigen Implementierungen deaktiviert sein).
[bearbeiten] Signalhandler
Die folgenden Einschränkungen gelten für die benutzerdefinierte Funktion, die als Signalhandler installiert wird.
Wenn die benutzerdefinierte Funktion bei der Behandlung von SIGFPE, SIGILL oder SIGSEGV zurückkehrt, ist das Verhalten undefiniert.
Wenn der Signalhandler als Ergebnis von abort oder raise aufgerufen wird, ist das Verhalten undefiniert, wenn der Signalhandler raise aufruft.
Wenn der Signalhandler NICHT als Ergebnis von abort oder raise aufgerufen wird (mit anderen Worten, der Signalhandler ist *asynchron*), ist das Verhalten undefiniert, wenn
- Der Signalhandler eine Funktion aus der Standardbibliothek aufruft, außer
- abort
- _Exit
- quick_exit
-
signalmit dem ersten Argument als Nummer des aktuell behandelten Signals (asynchrone Handler können sich selbst neu registrieren, aber keine anderen Signale). - atomare Funktionen aus
<stdatomic.h>, wenn die atomaren Argumente lock-free sind - atomic_is_lock_free (mit beliebigen atomaren Argumenten)
- Der Signalhandler auf ein Objekt mit statischer oder Thread-lokaler(seit C11) Speicherdauer zugreift, die kein lock-free atomares Element ist(seit C11), außer durch Zuweisung an ein statisches volatile sig_atomic_t.
Beim Eintritt in den Signalhandler ist der Zustand der Gleitkomma-Umgebung und die Werte aller Objekte nicht spezifiziert, außer
- Objekte vom Typ volatile sig_atomic_t
- Objekte von lock-free atomaren Typen (seit C11)
- Seiteneffekte, die durch atomic_signal_fence sichtbar gemacht wurden (seit C11)
Bei Rückkehr aus einem Signalhandler ist der Wert jedes durch den Signalhandler modifizierten Objekts, das kein volatile sig_atomic_t oder lock-free atomic ist (seit C11) undefiniert.
Das Verhalten ist undefiniert, wenn signal in einem multithreaded Programm verwendet wird. Es ist nicht erforderlich, thread-sicher zu sein.
[bearbeiten] Anmerkungen
POSIX verlangt, dass signal thread-sicher ist, und spezifiziert eine Liste von asynchron-signal-sicheren Bibliotheksfunktionen, die von jedem Signalhandler aufgerufen werden dürfen.
Neben abort und raise spezifiziert POSIX, dass kill, pthread_kill und sigqueue synchrone Signale erzeugen.
POSIX empfiehlt sigaction anstelle von signal, aufgrund seines unter-spezifizierten Verhaltens und signifikanter Implementierungsvariationen bezüglich der Signallieferung während der Ausführung eines Signalhandlers.
[bearbeiten] Beispiel
#include <signal.h> #include <stdio.h> volatile sig_atomic_t gSignalStatus; void signal_handler(int signal) { gSignalStatus = signal; } int main(void) { signal(SIGINT, signal_handler); printf("SignalValue: %d\n", gSignalStatus); printf("Sending signal: %d\n", SIGINT); raise(SIGINT); printf("SignalValue: %d\n", gSignalStatus); }
Ausgabe
SignalValue: 0 Sending signal: 2 SignalValue: 2
[bearbeiten] Referenzen
- C17-Standard (ISO/IEC 9899:2018)
- 7.14.1.1 Die Funktion signal (S. 193-194)
- C11-Standard (ISO/IEC 9899:2011)
- 7.14.1.1 Die Funktion signal (S. 266-267)
- C99-Standard (ISO/IEC 9899:1999)
- 7.14.1.1 Die Funktion signal (S. 247-248)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 4.7.1.1 Die Funktion signal
[bearbeiten] Siehe auch
| führt den Signal-Handler für ein bestimmtes Signal aus (Funktion) | |
| C++ Dokumentation für signal
| |