„Signal (Unix)“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Gängige UNIX-Signale: Tabelle erweitert
K typos
 
(40 dazwischenliegende Versionen von 22 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Bei Verwendung des [[Betriebssystem]]s [[Unix]] ist ein '''Signal''' eine Systemnachricht an einen laufenden [[Prozess (Computer)|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.
Bei Verwendung des [[Betriebssystem]]s [[Unix]] ist ein '''Signal''' eine Systemnachricht an einen laufenden [[Prozess (Informatik)|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 ==
== 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.
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 [[Kurzwort|Kurzform]] von Signal.
Mit dem Befehl „kill -l“ (kleines „L“) werden gewöhnlich alle unterstützten Signalnummern mit den zugehörigen Namen ausgegeben. Die Tabelle unten enthält beispielhaft die folgenden Werte:
*Spalte A: GNU-C-Bibliothek
*Spalte B: Linux, Architekturen [[Alpha-Prozessor|Alpha]] und [[Oracle_SPARC|Sparc]]
*Spalte C: Linux, [[IA-32|x86]], [[AMD64]], [[ARM-Architektur|ARM]] und die meisten anderen [[Prozessorarchitektur]]en
*Spalte D: Linux, [[MIPS-Architektur|MIPS]]


Mit dem Befehl <code>kill -l</code> werden gewöhnlich alle unterstützten Signalnummern mit den zugehörigen Namen ausgegeben. Die Tabelle unten enthält beispielhaft die folgenden Werte:
{|class="prettytable"
* Spalte A: GNU-C-Bibliothek
* Spalte B: Linux, Architekturen [[Alpha-Prozessor|Alpha]] und [[SPARC-Architektur|SPARC]]
* Spalte C: Linux, [[IA-32|x86]], [[x64|AMD64]], [[Arm-Architektur|ARM]] und die meisten anderen [[Prozessorarchitektur]]en
* Spalte D: Linux, [[MIPS-Architektur|MIPS]]

{| class="wikitable"
|-
|-
!rowspan="2"|Signal
! rowspan="2"|Signal
!colspan="4"|Werte, Synonym
! colspan="4"|Werte, Synonym
!rowspan="2"|Bedeutung (englisch)
! rowspan="2"|Bedeutung (englisch)
!rowspan="2"|Ursprüngliche Verwendung, Standards
! rowspan="2"|Bedeutung (übersetzt)
! rowspan="2"|Ursprüngliche Verwendung, Standards
|-
|-
!style="text-align:center"|A
! style="text-align:center"|A
!style="text-align:center"|B
! style="text-align:center"|B
!style="text-align:center"|C
! style="text-align:center"|C
!style="text-align:center"|D
! style="text-align:center"|D
|-
|-
|[[SIGHUP]]
|[[SIGHUP]]
|colspan="4" style="text-align:center"|1
|colspan="4" style="text-align:center"|1
|Hangup detected on controlling terminal or death of controlling process
|Hangup detected on controlling terminal or death of controlling process
|Unterbrechung der Verbindung zum [[Terminal (Computer)|Terminal]]
|[[Portable Operating System Interface|POSIX]] (1990)
|[[System V]];<ref>https://tldp.org/LDP/Linux-Filesystem-Hierarchy/html/signals.html</ref> [[Portable Operating System Interface|POSIX]] (1990)
|-
|-
|[[SIGINT (Signal)|SIGINT]]
|[[SIGINT (Signal)|SIGINT]]
|colspan="4" style="text-align:center"|2
|colspan="4" style="text-align:center"|2
|Interrupt from keyboard; interactive attention signal.
|Interrupt from keyboard; interactive attention signal.
|[[Interrupt]] durch die Tastatur; interaktives Warnsignal.
|[[Varianten_der_Programmiersprache_C|C89]]; POSIX (1990)
|[[Varianten der Programmiersprache C|C89]]; POSIX (1990)
|-
|-
|[[SIGQUIT]]
|[[SIGQUIT]]
|colspan="4" style="text-align:center"|3
|colspan="4" style="text-align:center"|3
|Quit from keyboard.
|Quit from keyboard.
|Beenden durch die Tastatur.
|
|
|-
|-
Zeile 40: Zeile 46:
|colspan="4" style="text-align:center"|4
|colspan="4" style="text-align:center"|4
|Illegal instruction.
|Illegal instruction.
|Ungültige Anweisung.
|[[Varianten_der_Programmiersprache_C|C89]]; [[Portable Operating System Interface|POSIX]] (1990)
|C89; POSIX (1990)
|-
|-
|[[SIGTRAP]]
|[[SIGTRAP]]
|colspan="4" style="text-align:center"|5
|colspan="4" style="text-align:center"|5
|Trace/breakpoint trap.
|Trace/breakpoint trap.
|Haltemarke erreicht.
|[[Single_Unix_Specification|SUSv2]]; [[Portable Operating System Interface|POSIX]] (2001)
|[[Single UNIX Specification|SUSv2]]; POSIX (2001)
|-
|-
|rowspan="2"|[[SIGABRT]]
|rowspan="2"|[[SIGABRT]]
|colspan="4" style="text-align:center"|6
|colspan="4" style="text-align:center"|6
|rowspan="2"|Abnormal termination; abort signal from abort(3).
|rowspan="2"|Abnormal termination; abort signal from abort(3).
|rowspan="2"|[[Prozess (Informatik)#Prozessbeendigung|abnormale Beendigung]].
|rowspan="2"|[[Varianten_der_Programmiersprache_C|C89]]; [[Portable Operating System Interface|POSIX]] (1990)
| rowspan="2" |C89; POSIX (1990)
|-
|-
|colspan="4" style="text-align:center"|SIGIOT
|colspan="4" style="text-align:center"|SIGIOT
Zeile 57: Zeile 66:
|colspan="4" style="text-align:center"|6
|colspan="4" style="text-align:center"|6
|rowspan="2"|IOT trap; abort() on a PDP11.
|rowspan="2"|IOT trap; abort() on a PDP11.
|rowspan="2"|
|rowspan="2"|[[Berkeley Software Distribution|4.2BSD]]
|rowspan="2"|[[Berkeley Software Distribution|4.2BSD]]
|-
|-
Zeile 66: Zeile 76:
|style="text-align:center"|–
|style="text-align:center"|–
|style="text-align:center"|7
|style="text-align:center"|7
|
|
|
|
|
Zeile 75: Zeile 86:
|style="text-align:center"|10
|style="text-align:center"|10
|BUS error (bad memory access).
|BUS error (bad memory access).
|BUS Fehler ([[Speicherzugriffsfehler]]).
|[[Berkeley Software Distribution|4.2BSD]]; [[Single_Unix_Specification|SUSv2]]; [[Portable Operating System Interface|POSIX]] (2001)
|4.2BSD; SUSv2; POSIX (2001)
|-
|-
|[[SIGFPE]]
|[[SIGFPE]]
|colspan="4" style="text-align:center"|8
|colspan="4" style="text-align:center"|8
|"Floating-point exception": erroneous arithmetic operation.
|„Floating-point exception“: erroneous arithmetic operation.
|„[[Gleitkommaoperation]] [[Ausnahmefehler]]“: fehlerhafte arithmetische Operation.
|[[Varianten_der_Programmiersprache_C|C89]]; [[Portable Operating System Interface|POSIX]] (1990)
|C89; POSIX (1990)
|-
|-
|[[SIGKILL]]
|[[SIGKILL]]
|colspan="4" style="text-align:center"|9
|colspan="4" style="text-align:center"|9
|Kill, unblockable.
|Kill, unblockable.
|Unblockbares Beenden.
|[[Portable Operating System Interface|POSIX]] (1990)
|POSIX (1990)
|-
|-
|[[SIGUSR1]]
|[[SIGUSR1]]
Zeile 92: Zeile 106:
|style="text-align:center"|10
|style="text-align:center"|10
|style="text-align:center"|16
|style="text-align:center"|16
|User-defined signal 1
|User-defined signal 1.
|Benutzerdefiniertes Signal 1.
|[[Portable Operating System Interface|POSIX]]
|POSIX
|-
|-
|[[SIGSEGV]]
|[[SIGSEGV]]
|colspan="4" style="text-align:center"|11
|colspan="4" style="text-align:center"|11
|"Segmentation violation": invalid memory reference.
|„Segmentation violation“: invalid memory reference.
|„[[Schutzverletzung]]“: ungültige Speicherreferenz.
|[[Varianten_der_Programmiersprache_C|C89]]; [[Portable Operating System Interface|POSIX]] (1990)
|C89; POSIX (1990)
|-
|-
|[[SIGUSR2]]
|[[SIGUSR2]]
Zeile 105: Zeile 121:
|style="text-align:center"|12
|style="text-align:center"|12
|style="text-align:center"|17
|style="text-align:center"|17
|User-defined signal 2
|User-defined signal 2.
|Benutzerdefiniertes Signal 2.
|[[Portable Operating System Interface|POSIX]]
|POSIX
|-
|-
|[[SIGPIPE]]
|[[SIGPIPE]]
|colspan="4" style="text-align:center"|13
|colspan="4" style="text-align:center"|13
|"Broken pipe": write to pipe with no readers.
|„Broken pipe“: write to pipe with no readers.
|„Broken [[Pipe (Informatik)|pipe]]“: Schreiben auf eine Pipe ohne Empfänger.
|[[Portable Operating System Interface|POSIX]] (1990)
|POSIX (1990)
|-
|-
|[[SIGALRM]]
|[[SIGALRM]]
|colspan="4" style="text-align:center"|14
|colspan="4" style="text-align:center"|14
|Alarm clock timer signal: alarm(2).
|Alarm clock timer signal: alarm(2).
|Wecker Signal: Alarm(2).
|[[Portable Operating System Interface|POSIX]] (1990)
|POSIX (1990)
|-
|-
|[[SIGTERM]]
|[[SIGTERM]]
|colspan="4" style="text-align:center"|15
|colspan="4" style="text-align:center"|15
|Termination request.
|Termination request.
|[[Prozess (Informatik)#Prozessbeendigung|Beendigungsanfrage]].
|[[Varianten_der_Programmiersprache_C|C89]]; [[Portable Operating System Interface|POSIX]] (1990)
|C89; POSIX (1990)
|-
|-
|[[SIGSTKFLT]]
|[[SIGSTKFLT]]
Zeile 129: Zeile 149:
|style="text-align:center"|–
|style="text-align:center"|–
|Stack fault on coprocessor (unused).
|Stack fault on coprocessor (unused).
|[[Stapelspeicher|Stapelfehler]] auf Coprozessor (unbenutzt).
|
|
|-
|-
|rowspan="2"|[[SIGCHLD]]
|rowspan="2"|[[SIGCHLD]]
Zeile 136: Zeile 157:
|style="text-align:center"|17
|style="text-align:center"|17
|style="text-align:center"|18
|style="text-align:center"|18
|rowspan="2"|Child status has changed (stopped or terminated.)
|rowspan="2"|Child status has changed (stopped or terminated).
|rowspan="2"|[[Prozess (Informatik)#Programmbeispiele|Kindstatus]] wurde geändert (angehalten oder beendet).
|rowspan="2"|[[Portable Operating System Interface|POSIX]] (1990)
| rowspan="2" |POSIX (1990)
|-
|-
|colspan="4" style="text-align:center"|SIGCLD
|colspan="4" style="text-align:center"|SIGCLD
Zeile 147: Zeile 169:
|style="text-align:center"|–
|style="text-align:center"|–
|rowspan="2"|Old System V name; child status has changed.
|rowspan="2"|Old System V name; child status has changed.
|rowspan="2"|Alte [[System V]] Bezeichnung; Kindstatus wurde geändert.
|rowspan="2"|System V
|rowspan="2"|System V
|-
|-
Zeile 157: Zeile 180:
|style="text-align:center"|25
|style="text-align:center"|25
|Continue stopped process.
|Continue stopped process.
|Fahre angehaltenen Prozess fort.
|[[Portable Operating System Interface|POSIX]]
|POSIX
|-
|-
|[[SIGSTOP]]
|[[SIGSTOP]]
Zeile 165: Zeile 189:
|style="text-align:center"|23
|style="text-align:center"|23
|Stop process, unblockable.
|Stop process, unblockable.
|Halte Prozess an, unblockierbar.
|[[Portable Operating System Interface|POSIX]]
|POSIX
|-
|-
|[[SIGTSTP]]
|[[SIGTSTP]]
Zeile 173: Zeile 198:
|style="text-align:center"|24
|style="text-align:center"|24
|Stop typed at keyboard.
|Stop typed at keyboard.
|Eingabe von Stop durch die Tastatur.
|[[Portable Operating System Interface|POSIX]]
|POSIX
|-
|-
|[[SIGTTIN]]
|[[SIGTTIN]]
Zeile 181: Zeile 207:
|style="text-align:center"|26
|style="text-align:center"|26
|Background read from tty.
|Background read from tty.
|Lesen vom [[Terminal (Computer)|Terminal]] im Hintergrund
|[[Portable Operating System Interface|POSIX]]
|POSIX
|-
|-
|[[SIGTTOU]]
|[[SIGTTOU]]
Zeile 189: Zeile 216:
|style="text-align:center"|27
|style="text-align:center"|27
|Background write to tty
|Background write to tty
|Schreiben auf ein Terminal im Hintergrund.
|[[Portable Operating System Interface|POSIX]]
|POSIX
|-
|-
|[[SIGURG]]
|[[SIGURG]]
Zeile 197: Zeile 225:
|style="text-align:center"|21
|style="text-align:center"|21
|Urgent condition on socket: high bandwidth data is available.
|Urgent condition on socket: high bandwidth data is available.
|Wichtiger Zustand auf Socket: Daten mit hoher Bandbreite sind verfügbar.
|[[Berkeley Software Distribution|4.2BSD]]; [[Single_Unix_Specification|SUSv2]]; [[Portable Operating System Interface|POSIX]] (2001)
|4.2BSD; SUSv2; POSIX (2001)
|-
|-
|[[SIGXCPU]]
|[[SIGXCPU]]
Zeile 205: Zeile 234:
|style="text-align:center"|30
|style="text-align:center"|30
|CPU time limit exceeded.
|CPU time limit exceeded.
|Prozessorzeitbegrenzung überschritten.
|[[Berkeley Software Distribution|4.2BSD]]; [[Single_Unix_Specification|SUSv2]]; [[Portable Operating System Interface|POSIX]] (2001)
|4.2BSD; SUSv2; POSIX (2001)
|-
|-
|[[SIGXFSZ]]
|[[SIGXFSZ]]
Zeile 213: Zeile 243:
|style="text-align:center"|31
|style="text-align:center"|31
|File size limit exceeded.
|File size limit exceeded.
|Dateigrößenbeschränkung überschritten.
|[[Berkeley Software Distribution|4.2BSD]]; [[Single_Unix_Specification|SUSv2]]; [[Portable Operating System Interface|POSIX]] (2001)
|4.2BSD; SUSv2; POSIX (2001)
|-
|-
|[[SIGVTALRM]]
|[[SIGVTALRM]]
Zeile 221: Zeile 252:
|style="text-align:center"|28
|style="text-align:center"|28
|Virtual alarm clock.
|Virtual alarm clock.
|Virtueller Wecker.
|[[Berkeley Software Distribution|4.2BSD]]; [[Single_Unix_Specification|SUSv2]]; [[Portable Operating System Interface|POSIX]] (2001)
|4.2BSD; SUSv2; POSIX (2001)
|-
|-
|[[SIGPROF]]
|[[SIGPROF]]
Zeile 229: Zeile 261:
|style="text-align:center"|29
|style="text-align:center"|29
|Profiling alarm clock timer expired.
|Profiling alarm clock timer expired.
|
|[[Berkeley Software Distribution|4.2BSD]]; [[Single_Unix_Specification|SUSv2]]; [[Portable Operating System Interface|POSIX]] (2001)
|4.2BSD; SUSv2; POSIX (2001)
|-
|-
|[[SIGWINCH]]
|[[SIGWINCH]]
Zeile 237: Zeile 270:
|style="text-align:center"|20
|style="text-align:center"|20
|Window size change.
|Window size change.
|Fenstergröße änderte sich.
|[[Berkeley Software Distribution|4.3BSD]]; Sun
|4.3BSD; Sun
|-
|-
|rowspan="2"|[[SIGPOLL]]
|rowspan="2"|[[SIGPOLL]]
Zeile 245: Zeile 279:
|style="text-align:center"|23/–
|style="text-align:center"|23/–
|rowspan="2"|Pollable event occurred.
|rowspan="2"|Pollable event occurred.
|rowspan="2"|Abfragbares Ereignis aufgetreten.
|rowspan="2"|System V; [[Single_Unix_Specification|SUSv2]]; [[Portable Operating System Interface|POSIX]] (2001)
| rowspan="2" |System V; SUSv2; POSIX (2001)
|-
|-
|colspan="4" style="text-align:center"|SIGIO
|colspan="4" style="text-align:center"|SIGIO
Zeile 255: Zeile 290:
|style="text-align:center"|23
|style="text-align:center"|23
|rowspan="2"|I/O now possible.
|rowspan="2"|I/O now possible.
|rowspan="2"|[[Berkeley Software Distribution|4.2BSD]]
|rowspan="2"|[[Eingabe und Ausgabe|I/O]] jetzt möglich.
|rowspan="2"|4.2BSD
|-
|-
|colspan="4" style="text-align:center"|SIGPOLL
|colspan="4" style="text-align:center"|SIGPOLL
Zeile 265: Zeile 301:
|style="text-align:center"|–
|style="text-align:center"|–
|rowspan="2"|Status request from keyboard.
|rowspan="2"|Status request from keyboard.
|rowspan="2"|Mac OS X
|rowspan="2"|Statusanfrage durch die Tastatur.
|rowspan="2"|[[macOS]]
|-
|-
|colspan="4" style="text-align:center"|SIGPWR
|colspan="4" style="text-align:center"|SIGPWR
Zeile 275: Zeile 312:
|style="text-align:center"|–
|style="text-align:center"|–
|Unused; only on Sparc: file lock lost.
|Unused; only on Sparc: file lock lost.
|Unbenutzt; nur unter Sparc: Dateisperre verloren.
|
|
|-
|-
Zeile 283: Zeile 321:
|style="text-align:center"|19
|style="text-align:center"|19
|rowspan="2"|Power failure restart.
|rowspan="2"|Power failure restart.
|rowspan="2"|Stromausfall bedingter Neustart.
|rowspan="2"|System V
|rowspan="2"|System V
|-
|-
Zeile 293: Zeile 332:
|style="text-align:center"|12
|style="text-align:center"|12
|rowspan="2"|Bad system call.
|rowspan="2"|Bad system call.
|rowspan="2"|ungültiger [[Systemaufruf]].
|rowspan="2"|System Vr4; [[Single_Unix_Specification|SUSv2]]; [[Portable Operating System Interface|POSIX]] (2001)
| rowspan="2" |System Vr4; SUSv2; POSIX (2001)
|-
|-
|colspan="4" style="text-align:center"|SIGUNUSED
|colspan="4" style="text-align:center"|SIGUNUSED
Zeile 302: Zeile 342:
|style="text-align:center"|31/–
|style="text-align:center"|31/–
|style="text-align:center"|–
|style="text-align:center"|–
|rowspan="2"|
|rowspan="2"|
|rowspan="2"|
|rowspan="2"|
|rowspan="2"|
Zeile 308: Zeile 349:
|}
|}


Neuere [[Linux]]-Versionen verwenden neben den üblichen 31 Signalnummern noch bis zu 32 weitere Signale ab 33 (oder 34, beziehungsweise 35 je nach C-Bilbiothek) ([[SIGRTMIN]]) bis 64 ([[SIGRTMAX]]) als Echtzeitsignale.
Neuere [[Linux]]-Versionen verwenden neben den üblichen 31 Signalnummern noch bis zu 32 weitere Signale als Echtzeit (''R''eal-''T''ime) Signale: von [[SIGRTMIN]], je nach C-Bibliothek 33, 34 oder 35, bis [[SIGRTMAX]] (64).


== Aktionen ==
== Aktionen ==
Das Standardverhalten der Programme, wenn sie eines der Signale empfangen, ist eine der folgenden Aktionen:
Durch ein Signal kann jeweils eine der folgenden Aktionen ausgelöst werden:
*Anhalten (nicht beenden) des laufenden Programms.
* Anhalten (nicht beenden) des [[Prozess (Informatik)|Prozesses]].
*Fortsetzen des zuvor angehaltenen Programms.
* Fortsetzen des zuvor angehaltenen Prozesses.
* Beenden des Prozesses ohne einen [[Dump|Speicherauszug]]. Der Elternprozess kann die Signalnummer ermitteln. In den Ergebnissen der Funktionen <code>wait</code>, <code>waitpid</code> usw. ist die Nummer enthalten.<ref>https://manpages.ubuntu.com/manpages/kinetic/man2/waitpid.2.html</ref>
*Beenden des Programms ohne einen Speicherauszug.
*Beenden des Programms mit Schreiben eines Speicherauszugs.
* Beenden des Prozesses mit Schreiben eines [[Dump|Speicherauszug]].
:Bei vielen Systemen kann der Speicherauszug begrenzt werden (z.&nbsp;B. in der [[Bash (Shell)|<code>bash</code>]] durch <code>ulimit -c</code>).
*Ignorieren des Signals.
:Die Signalnummer ist im Speicherauszug enthalten. Der Elternprozess kann die Signalnummer genauso wie beim Beenden ohne Speicherauszug ermitteln.
Bis auf ''SIGKILL'' und ''SIGSTOP'' können die Signale vom Programm „abgefangen“ werden und eine andere Reaktion auslösen.
* Ignorieren des Signals.
* Aufrufen eines [[Unterprogramm]]s (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&nbsp;V]] und [[ANSI C]] durch die Funktion <code>signal</code><ref>https://manpages.org/signal/2</ref> implementiert.
Diese Funktion ist aus vielen Programmumgebungen erreichbar, z.&nbsp;B. <code>trap</code> bei den üblichen Shells oder die Funktion <code>signal</code> im gleichnamigen Modul der Programmiersprache [[Python (Programmiersprache)|Python]].<ref>https://docs.python.org/3/library/signal.html</ref> Daneben gibt es in der [[Berkeley Software Distribution]] (BSD) Möglichkeiten, Signale zu blockieren und später zu verarbeiten (<code>sigvec</code> usw.).<ref>https://linux.die.net/man/3/sigvec</ref> Weiterhin gibt es den [[POSIX]] Standard (<code>sigaction</code>).<ref>https://manpages.ubuntu.com/manpages/trusty/man2/sigaction.2.html</ref>

Das Signal wird durch einen einfachen Datentyp, eine Nummer, repräsentiert, die üblicherweise als [[Symbolische Konstante]] angegeben wird. Der [[Compiler|Ü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 Hardwareplattformen unterschiedliche Zahlen für die Signale an. Die Signalnummern werden durch Dateien wie <code>signal.h</code>, <code>signal.py</code> und ähnlichen bekannt gemacht.

Der Signalhandler ist eine einfache Funktion, die die Signalnummer als [[Parameter (Informatik)|Parameter]] bekommt. Bei BSD und POSIX gibt es weitere Parameter. Der Signalhandler kann im Programm Variablen setzen und Funktionen aufrufen (z.&nbsp;B. <code>exit</code> 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 / [[Gleitkommaeinheit|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 / [[Memory Management Unit|MMU]] (englisch Memory Management Unit) Speicherverwaltungseinheit.
:Hier entstehen Signale wie [[SIGBUS]] und [[SIGSEGV]].

*[[Gerätetreiber]]
:Die ersten drei Signale mit den Nummern eins bis drei sind SIGHUP, SIGINT, SIGQUIT. Sie kommen ursprünglich aus dem Gerätetreiber für [[Terminal (Computer)|Terminals]]. Historisch waren das Treiber für serielle Schnittstellen, heute sind es meist Pseudoterminals.

*[[Kernel (Betriebssystem)|Kernel]].
:Der Kernel sendet beim Beenden eines Prozesses an den Elternprozess ein Signal [[SIGCLD]] (oder SIGCHLD). Das Erreichen von Ressourcengrenzen signalisiert er mit ([[SIGXCPU]], [[SIGXFSZ]]). Probleme mit einer Pipe signalisiert [[SIGPIPE]]...

*[[Teilsystem|Subsysteme]].
:In Subsystemen wie Netzwerk oder grafischer Bedienoberfläche entstehen Signale wie [[SIGURG]] (besondere (urgent) Bedingung an einer Netzwerkverbindung) oder [[SIGWINCH]] (Größe eines [[Fenster (Computer)|Fensters]] geändert).

*[[Software]].
: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 ==
* 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'')
* 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)


== Siehe auch ==
== Siehe auch ==
Das Unix-Kommando [[Kill (Unix)|kill]] kann verwendet werden, um beliebige Signale unter Unix zu senden.
Das [[Unix-Kommando]] [[Kill (Unix)|kill]] kann verwendet werden, um beliebige Signale unter Unix zu senden.


== Weblinks ==
== Weblinks ==
* [http://www.wlug.org.nz/Signal Auflistung und Beschreibung gängiger Signale]
* [http://wiki.wlug.org.nz/Signal Auflistung und Beschreibung gängiger Signale (englisch)]
* [http://man7.org/linux/man-pages/man7/signal.7.html Handbuchseite des Betriebssystems Linux]
* [http://sourceware.org/git/?p=glibc.git;a=blob;f=bits/signum.h;h=1a3e54bfe2e3d795831d717421c55c32aa3e31f0;hb=HEAD Datei „signum.h“ der GNU-C-Bibliothek]

== Einzelnachweise ==
<references />

{{Navigationsleiste Befehle der GNU core utilities}}


[[Kategorie:Unix]]
[[Kategorie:Unix-Betriebssystemkomponente]]
[[Kategorie:POSIX]]
[[Kategorie:POSIX-Signal| ]]
[[Kategorie:Signal]]

Aktuelle Version vom 1. Juni 2024, 20:46 Uhr

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

[Bearbeiten | Quelltext bearbeiten]

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:

Signal Werte, Synonym Bedeutung (englisch) Bedeutung (übersetzt) Ursprüngliche Verwendung, Standards
A B C D
SIGHUP 1 Hangup detected on controlling terminal or death of controlling process Unterbrechung der Verbindung zum Terminal System V;[1] POSIX (1990)
SIGINT 2 Interrupt from keyboard; interactive attention signal. Interrupt durch die Tastatur; interaktives Warnsignal. C89; POSIX (1990)
SIGQUIT 3 Quit from keyboard. Beenden durch die Tastatur.
SIGILL 4 Illegal instruction. Ungültige Anweisung. C89; POSIX (1990)
SIGTRAP 5 Trace/breakpoint trap. Haltemarke erreicht. SUSv2; POSIX (2001)
SIGABRT 6 Abnormal termination; abort signal from abort(3). abnormale Beendigung. C89; POSIX (1990)
SIGIOT
SIGIOT 6 IOT trap; abort() on a PDP11. 4.2BSD
SIGABRT
SIGEMT 7 7
SIGBUS 10 10 7 10 BUS error (bad memory access). BUS Fehler (Speicherzugriffsfehler). 4.2BSD; SUSv2; POSIX (2001)
SIGFPE 8 „Floating-point exception“: erroneous arithmetic operation. Gleitkommaoperation Ausnahmefehler“: fehlerhafte arithmetische Operation. C89; POSIX (1990)
SIGKILL 9 Kill, unblockable. Unblockbares Beenden. POSIX (1990)
SIGUSR1 30 30 10 16 User-defined signal 1. Benutzerdefiniertes Signal 1. POSIX
SIGSEGV 11 „Segmentation violation“: invalid memory reference. Schutzverletzung“: ungültige Speicherreferenz. C89; POSIX (1990)
SIGUSR2 31 31 12 17 User-defined signal 2. Benutzerdefiniertes Signal 2. POSIX
SIGPIPE 13 „Broken pipe“: write to pipe with no readers. „Broken pipe“: Schreiben auf eine Pipe ohne Empfänger. POSIX (1990)
SIGALRM 14 Alarm clock timer signal: alarm(2). Wecker Signal: Alarm(2). POSIX (1990)
SIGTERM 15 Termination request. Beendigungsanfrage. C89; POSIX (1990)
SIGSTKFLT 16 Stack fault on coprocessor (unused). Stapelfehler auf Coprozessor (unbenutzt).
SIGCHLD 20 20 17 18 Child status has changed (stopped or terminated). Kindstatus wurde geändert (angehalten oder beendet). POSIX (1990)
SIGCLD
SIGCLD 20 Old System V name; child status has changed. Alte System V Bezeichnung; Kindstatus wurde geändert. System V
SIGCHLD
SIGCONT 19 19 18 25 Continue stopped process. Fahre angehaltenen Prozess fort. POSIX
SIGSTOP 17 17 19 23 Stop process, unblockable. Halte Prozess an, unblockierbar. POSIX
SIGTSTP 18 18 20 24 Stop typed at keyboard. Eingabe von Stop durch die Tastatur. POSIX
SIGTTIN 21 21 21 26 Background read from tty. Lesen vom Terminal im Hintergrund POSIX
SIGTTOU 22 22 22 27 Background write to tty Schreiben auf ein Terminal im Hintergrund. POSIX
SIGURG 16 16 23 21 Urgent condition on socket: high bandwidth data is available. Wichtiger Zustand auf Socket: Daten mit hoher Bandbreite sind verfügbar. 4.2BSD; SUSv2; POSIX (2001)
SIGXCPU 24 24 24 30 CPU time limit exceeded. Prozessorzeitbegrenzung überschritten. 4.2BSD; SUSv2; POSIX (2001)
SIGXFSZ 25 25 25 31 File size limit exceeded. Dateigrößenbeschränkung überschritten. 4.2BSD; SUSv2; POSIX (2001)
SIGVTALRM 26 26 26 28 Virtual alarm clock. Virtueller Wecker. 4.2BSD; SUSv2; POSIX (2001)
SIGPROF 27 27 27 29 Profiling alarm clock timer expired. 4.2BSD; SUSv2; POSIX (2001)
SIGWINCH 28 28 20 Window size change. Fenstergröße änderte sich. 4.3BSD; Sun
SIGPOLL 23 23/– 29/– 23/– Pollable event occurred. Abfragbares Ereignis aufgetreten. System V; SUSv2; POSIX (2001)
SIGIO
SIGIO 23 23 29 23 I/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) 30 19 Power failure restart. Stromausfall bedingter Neustart. System V
SIGINFO
SIGSYS 12 12 31 12 Bad system call. ungültiger Systemaufruf. System Vr4; SUSv2; POSIX (2001)
SIGUNUSED
SIGUNUSED 12 31/–
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).

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.

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 Hardwareplattformen 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.

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 Ressourcengrenzen 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.

  • 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)
  • 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)

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

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  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