Signal (Unix)

Bei Verwendung des Betriebssystems Unix ist ein Signal eine Systemnachricht an einen laufenden Prozess. Signale sind eine primitive Form der Interprozesskommunikation. Die meisten Signale bewirken auch eine Aktion – meist das Beenden des Prozesses. Andere hingegen dienen lediglich der Information (z. B. SIGWINCH) oder können einen Prozess anhalten (SIGSTOP). Es gibt auch vom Benutzer frei verwendbare Signale (SIGUSR1 und SIGUSR2). Einige Signale können vom Prozess abgefangen oder unterdrückt werden. So fangen z. B. manche Serverprogramme (im Unix-Jargon „Daemon“) SIGUSR1 oder SIGUSR2 ab und lesen dann ihre Konfigurationsdateien neu ein.

Gängige UNIX-Signale

Im Folgenden werden die üblichen Signale mit ihren Nummern aufgelistet. Die unterstützten Signale und deren Werte können sich von System zu System unterscheiden. Der POSIX.1-Standard sieht hierbei unterschiedliche numerische Werte abhängig von der verwendeten Hardwarearchitektur vor.

Beim Präfix SIG handelt es sich jeweils um die Kurzform von Signal.

Mit dem Befehl kill -l werden gewöhnlich alle unterstützten Signalnummern mit den zugehörigen Namen ausgegeben. Die Tabelle unten enthält beispielhaft die folgenden Werte:

SignalWerte, SynonymBedeutung (englisch)Bedeutung (übersetzt)Ursprüngliche Verwendung, Standards
ABCD
SIGHUP1Hangup detected on controlling terminal or death of controlling processUnterbrechung der Verbindung zum TerminalSystem V;[1] POSIX (1990)
SIGINT2Interrupt from keyboard; interactive attention signal.Interrupt durch die Tastatur; interaktives Warnsignal.C89; POSIX (1990)
SIGQUIT3Quit from keyboard.Beenden durch die Tastatur.
SIGILL4Illegal instruction.Ungültige Anweisung.C89; POSIX (1990)
SIGTRAP5Trace/breakpoint trap.Haltemarke erreicht.SUSv2; POSIX (2001)
SIGABRT6Abnormal termination; abort signal from abort(3).abnormale Beendigung.C89; POSIX (1990)
SIGIOT
SIGIOT6IOT trap; abort() on a PDP11.4.2BSD
SIGABRT
SIGEMT77
SIGBUS1010710BUS error (bad memory access).BUS Fehler (Speicherzugriffsfehler).4.2BSD; SUSv2; POSIX (2001)
SIGFPE8„Floating-point exception“: erroneous arithmetic operation.Gleitkommaoperation Ausnahmefehler“: fehlerhafte arithmetische Operation.C89; POSIX (1990)
SIGKILL9Kill, unblockable.Unblockbares Beenden.POSIX (1990)
SIGUSR130301016User-defined signal 1.Benutzerdefiniertes Signal 1.POSIX
SIGSEGV11„Segmentation violation“: invalid memory reference.Schutzverletzung“: ungültige Speicherreferenz.C89; POSIX (1990)
SIGUSR231311217User-defined signal 2.Benutzerdefiniertes Signal 2.POSIX
SIGPIPE13„Broken pipe“: write to pipe with no readers.„Broken pipe“: Schreiben auf eine Pipe ohne Empfänger.POSIX (1990)
SIGALRM14Alarm clock timer signal: alarm(2).Wecker Signal: Alarm(2).POSIX (1990)
SIGTERM15Termination request.Beendigungsanfrage.C89; POSIX (1990)
SIGSTKFLT16Stack fault on coprocessor (unused).Stapelfehler auf Coprozessor (unbenutzt).
SIGCHLD20201718Child status has changed (stopped or terminated).Kindstatus wurde geändert (angehalten oder beendet).POSIX (1990)
SIGCLD
SIGCLD20Old System V name; child status has changed.Alte System V Bezeichnung; Kindstatus wurde geändert.System V
SIGCHLD
SIGCONT19191825Continue stopped process.Fahre angehaltenen Prozess fort.POSIX
SIGSTOP17171923Stop process, unblockable.Halte Prozess an, unblockierbar.POSIX
SIGTSTP18182024Stop typed at keyboard.Eingabe von Stop durch die Tastatur.POSIX
SIGTTIN21212126Background read from tty.Lesen vom Terminal im HintergrundPOSIX
SIGTTOU22222227Background write to ttySchreiben auf ein Terminal im Hintergrund.POSIX
SIGURG16162321Urgent condition on socket: high bandwidth data is available.Wichtiger Zustand auf Socket: Daten mit hoher Bandbreite sind verfügbar.4.2BSD; SUSv2; POSIX (2001)
SIGXCPU24242430CPU time limit exceeded.Prozessorzeitbegrenzung überschritten.4.2BSD; SUSv2; POSIX (2001)
SIGXFSZ25252531File size limit exceeded.Dateigrößenbeschränkung überschritten.4.2BSD; SUSv2; POSIX (2001)
SIGVTALRM26262628Virtual alarm clock.Virtueller Wecker.4.2BSD; SUSv2; POSIX (2001)
SIGPROF27272729Profiling alarm clock timer expired.4.2BSD; SUSv2; POSIX (2001)
SIGWINCH282820Window size change.Fenstergröße änderte sich.4.3BSD; Sun
SIGPOLL2323/–29/–23/–Pollable event occurred.Abfragbares Ereignis aufgetreten.System V; SUSv2; POSIX (2001)
SIGIO
SIGIO23232923I/O now possible.I/O jetzt möglich.4.2BSD
SIGPOLL
SIGINFO(29)Status request from keyboard.Statusanfrage durch die Tastatur.macOS
SIGPWR
SIGLOST(29)/–Unused; only on Sparc: file lock lost.Unbenutzt; nur unter Sparc: Dateisperre verloren.
SIGPWR(29)3019Power failure restart.Stromausfall bedingter Neustart.System V
SIGINFO
SIGSYS12123112Bad system call.ungültiger Systemaufruf.System Vr4; SUSv2; POSIX (2001)
SIGUNUSED
SIGUNUSED1231/–
SIGSYS

Neuere Linux-Versionen verwenden neben den üblichen 31 Signalnummern noch bis zu 32 weitere Signale als Echtzeit (Real-Time) Signale: von SIGRTMIN, je nach C-Bibliothek 33, 34 oder 35, bis SIGRTMAX (64).

Aktionen

Durch ein Signal kann jeweils eine der folgenden Aktionen ausgelöst werden:

  • Anhalten (nicht beenden) des Prozesses.
  • Fortsetzen des zuvor angehaltenen Prozesses.
  • Beenden des Prozesses ohne einen Speicherauszug. Der Elternprozess kann die Signalnummer ermitteln. In den Ergebnissen der Funktionen wait, waitpid usw. ist die Nummer enthalten.[2]
  • Beenden des Prozesses mit Schreiben eines Speicherauszug.
Bei vielen Systemen kann der Speicherauszug begrenzt werden (z. B. in der bash durch ulimit -c).
Die Signalnummer ist im Speicherauszug enthalten. Der Elternprozess kann die Signalnummer genauso wie beim Beenden ohne Speicherauszug ermitteln.
  • Ignorieren des Signals.
  • Aufrufen eines Unterprogramms (Signalhandler) zum Bearbeiten des Signals, dies wird abfangen genannt. Der Signalhandler muss vom Prozess eingestellt werden, bevor signalisiert wird. Der Signalhandler läuft innerhalb des Prozesses und kann auf die Daten des Prozesses zugreifen.

Bis auf die letzte Aktion (Signalhandler) kommen die Aktionen als standard (default) Aktion vor.

Aktion ändern

Außer bei den Signalen SIGKILL und SIGSTOP ist die Reaktion auf ein Signal durch den Prozess einstellbar. Dazu gibt es mehrere Möglichkeiten. Ein Verfahren ist in System V und ANSI C durch die Funktion signal[3] implementiert. Diese Funktion ist aus vielen Programmumgebungen erreichbar, z. B. trap bei den üblichen Shells oder die Funktion signal im gleichnamigen Modul der Programmiersprache Python[4]. Daneben gibt es in der Berkeley Software Distribution (BSD) Möglichkeiten, Signale zu blockieren und später zu verarbeiten (sigvec usw.)[5]. Weiterhin gibt es den POSIX Standard (sigaction)[6].

Das Signal wird durch einen einfachen Datentyp, eine Nummer, repräsentiert, die üblicherweise als Symbolische Konstante angegeben wird. Der Übersetzer oder Interpreter ermittelt zum Symbol die Nummer. Das ermöglicht die Übertragung von Programmen auf anderen (Unix-)Plattformen, ohne die Symbole zu ändern. POSIX gibt für verschiedene Hardwareplatformen unterschiedliche Zahlen für die Signale an. Die Signalnummern werden durch Dateien wie signal.h, signal.py und ähnlichen bekannt gemacht.

Der Signalhandler ist eine einfache Funktion, die die Signalnummer als Parameter bekommt. Bei BSD und POSIX gibt es weitere Parameter. Der Signalhandler kann im Programm Variablen setzen und Funktionen aufrufen (z. B. exit um den Prozess zu beenden).

Die oben genannten Funktionen kennen als Signalhandler besondere symbolische Konstanten:

  • SIG_DFL stellt die normale, default Aktion des Signals ein.
  • SIG_IGN führt zum Ignorieren des Signals.

Signalquellen

Die Quelle eines Signals kann in verschiedenen Schichten des Systems liegen, sei es Hardware, Kernel, Gerätetreiber oder Anwendungssoftware. Hardware und Software ändern sich mit dem technischen Fortschritt. Trotz Standardisierungen ist manches uneinheitlich. Der POSIX Standard sieht Abweichungen vor.

  • CPU (englisch Central Processing Unit) zentrale Arbeitseinheit.
Hier entstehen Signale wie SIGILL (ungültiger Opcode) und SIGTRAP.
  • CPU / FPU (englisch Floating Point Unit) Recheneinheit.
Hier entstehen Signale wie SIGFPE (englisch Floating Point Error, Rechenfehler).
Ein leicht zu reproduzierende Rechenfehler ist die Division durch Null.
  • CPU / MMU (englisch Memory Management Unit) Speicherverwaltungseinheit.
Hier entstehen Signale wie SIGBUS und SIGSEGV.
Die ersten drei Signale mit den Nummern eins bis drei sind SIGHUP, SIGINT, SIGQUIT. Sie kommen ursprünglich aus dem Gerätetreiber für Terminals. Historisch waren das Treiber für serielle Schnittstellen, heute sind es meist Pseudoterminals.
Der Kernel sendet beim Beenden eines Prozesses an den Elternprozess ein Signal SIGCLD (oder SIGCHLD). Das Erreichen von Resourcengrenzen signalisiert er mit (SIGXCPU, SIGXFSZ). Probleme mit einer Pipe signalisiert SIGPIPE...
In Subsystemen wie Netzwerk oder grafischer Bedienoberfläche entstehen Signale wie SIGURG (besondere (urgent) Bedingung an einer Netzwerkverbindung) oder SIGWINCH (Größe eines Fensters geändert).
Soweit der Hersteller das vorsieht, kann Software Signale an andere Prozesse senden und diese können auf das Signal reagieren.
Ein Beispiel ist das erneute Auswerten der Konfiguration. Dafür gibt es kein einheitliches Signal, meist wird SIGHUP, SIGUSR1 oder SIGUSR2 verwendet.

Das Beispiel SIGHUP zeigt, dass Signale (bzw. Signalnummern) unterschiedlich verwendet werden können. Wenn ein Signal normalerweise von einem Gerät erzeugt wird und sicher ist, dass kein Gerät benutzt wird, kann das Signal zu einem anderen Zweck genutzt werden.

Literatur

  • W. Richard Stevens: Programmieren von UNIX-Netzen. Aus dem Englischen von Michael Fuese, Werner Maisch, Eberhard Trautwein. Carl Hanser Verlag, München / Wien 1992, ISBN 3-446-16318-2, Kapitel 2.4 Signale Seite 54. (Englische Originalausgabe von Prentince-Hall ISBN 0-13-928748-5)
  • Jürgen Gulbins: UNIX. Springer Verlag, Berlin / Heidelberg / New York, 3. Auflage 1988, ISBN 3-540-19248-4. (Seite 106 Kommandos, Programme, Prozesse, Seite 575 Systemanschlüsse und C-Bibliotheksfunktionen)

Siehe auch

Das Unix-Kommando kill kann verwendet werden, um beliebige Signale unter Unix zu senden.

Weblinks

Einzelnachweise

  1. https://tldp.org/LDP/Linux-Filesystem-Hierarchy/html/signals.html
  2. https://manpages.ubuntu.com/manpages/kinetic/man2/waitpid.2.html
  3. https://manpages.org/signal/2
  4. https://docs.python.org/3/library/signal.html
  5. https://linux.die.net/man/3/sigvec
  6. https://manpages.ubuntu.com/manpages/trusty/man2/sigaction.2.html