Looking for c Keywords? Try Ask4Keywords

C LanguageSignalverarbeitung


Syntax

  • void (* signal (int sig, void (* func) (int))) (int);

Parameter

Parameter Einzelheiten
sig Das Signal, das den Signal-Handler auf " SIGABRT , " SIGFPE , " SIGILL , " SIGTERM , " SIGINT , " SIGSEGV oder einen durch die Implementierung definierten Wert setzen soll
func Der Signalhandler, einer der folgenden: SIG_DFL für den Standardhandler, SIG_IGN zum Ignorieren des Signals oder ein Funktionszeiger mit der Signatur void foo(int sig); .

Bemerkungen

Die Verwendung von Signalhandlern mit nur den Garantien des C-Standards unterliegt verschiedenen Einschränkungen, was im benutzerdefinierten Signalhandler möglich oder nicht möglich ist.

  • Wenn die benutzerdefinierte Funktion während der Behandlung von SIGSEGV , SIGFPE , SIGILL oder einem anderen implementierungsdefinierten Hardware-Interrupt zurückkehrt, ist das Verhalten durch den C-Standard nicht definiert. Dies liegt daran, dass die Schnittstelle von C keine Mittel zur Änderung des fehlerhaften Zustands gibt (z. B. nach einer Division durch 0 ) und daher bei der Rückkehr des Programms genau der gleiche fehlerhafte Zustand ist wie vor dem Auftreten des Hardware-Interrupts.

  • Wenn die benutzerdefinierte Funktion als Ergebnis eines abort oder raise aufgerufen wurde raise darf der Signalhandler nicht erneut raise aufrufen.

  • Signale können während jeder Operation eintreffen, und daher kann die Unteilbarkeit der Operationen im Allgemeinen nicht garantiert werden, und die Signalverarbeitung funktioniert bei der Optimierung nicht gut. Daher müssen alle Änderungen an den Daten in einem Signalhandler an Variablen vorgenommen werden

    • vom Typ sig_atomic_t (alle Versionen) oder einem sig_atomic_t atomaren Typ (seit C11, optional)
    • das sind volatile qualifiziert.
  • Bei anderen Funktionen der C-Standardbibliothek werden diese Einschränkungen normalerweise nicht beachtet, da sie möglicherweise Variablen im globalen Status des Programms ändern. Der C-Standard gibt nur Garantien für abort , _Exit (seit C99), quick_exit (seit C11), signal (für dieselbe Signalnummer) und einige atomare Operationen (seit C11).

Das Verhalten ist vom C-Standard nicht definiert, wenn eine der oben genannten Regeln verletzt wird. Plattformen können über bestimmte Erweiterungen verfügen, diese sind jedoch im Allgemeinen über diese Plattform nicht portierbar.

  • Normalerweise haben Systeme eine eigene Liste von Funktionen, die asynchrones Signalsicher sind , d. H. Von C-Bibliotheksfunktionen, die von einem Signalhandler verwendet werden können. ZB ist oft printf eine dieser Funktionen.

  • Insbesondere definiert der C-Standard nicht viel über die Interaktion mit seiner Thread-Schnittstelle (seit C11) oder mit plattformspezifischen Thread-Bibliotheken wie POSIX-Threads. Solche Plattformen müssen die Interaktion solcher Thread-Bibliotheken mit eigenen Signalen festlegen.

Signalverarbeitung Verwandte Beispiele