Kapitel 7 Signale
Signale werden zur Steuerung von Prozessen verwendet. Wie ein Prozess auf ein bestimmtes Signal reagiert, können Sie entweder dem System überlassen oder selbst festlegen.
7.1 Grundlagen zu den Signalen
 
Bei Signalen handelt es sich um asynchrone Ereignisse, die eine Unterbrechung (genauer eine Interrupt-Anforderung) auf der Prozessebene bewirken können. Dabei handelt es sich um ein einfaches Kommunikationsmittel zwischen zwei Prozessen (Interprozesskommunikation), bei dem ein Prozess einem anderen eine Nachricht senden kann. Bei den Nachrichten selbst handelt es sich wiederum um einfache Ganzzahlen, welche aber auch mit einem symbolischen (aussagekräftigen) Namen verwendet werden können (auch Macro genannt).
Vorwiegend werden Signale verwendet zur Synchronisation, zum Ausführen von vordefinierten Aktionen oder zum Beenden bzw. Unterbrechen von Prozessen. Generell lassen sich die Signale in drei Kategorien einordnen (die Bedeutung der einzelnen Signale erfahren Sie am Abschnittsende):
|
Systemsignale (Hardware- und Systemfehler, ILL, TRAP, BUS, FPE, KILL, SEGV, XCPU, XFSZ, IO) |
|
Gerätesignale (HUP, INT, PIPE, ALRM, CHLD, CONT, STOP, TTIN, TTOU, URG, WINCH, IO) |
|
Benutzerdefinierte Signale (QUIT, ABRT, USR1, USR2, TERM) |
Wenn ein Prozess ein bestimmtes Signal erhält, wird dieses Signal in einen so genannten Prozesstabelleneintrag hinterlegt. Sobald diesem Prozess Rechenzeit der CPU zur Verfügung steht, um seine Befehle abzuarbeiten, wird der Kernel aktiv und sieht nach, wie auf das Signal reagiert werden soll (alles natürlich ein wenig vereinfacht erklärt). Hier können Sie jetzt ins Geschehen eingreifen und auf das Eintreten eines Signals reagieren. Sofern Sie gar nichts unternehmen, führt der Kernel die Standardaktion für das entsprechende Signal aus. Was die Standardaktion ist, hängt vom jeweiligen Signal ab. Meistens handelt es sich dabei um die Beendigung des Prozesses. Einige Signale erzeugen auch einen Core-Dump (Speicherabbild eines Prozesses), welcher zum Debuggen verwendet werden kann.
Sofern Sie nicht wollen, dass die Standardaktion beim Auftreten eines Signals ausgeführt wird (und darum geht es auch in diesem Kapitel), können Sie das Signal abfangen und entsprechend darauf reagieren oder es gar vollständig ignorieren. Wenn Sie ein Signal ignorieren, kommt es gar nicht erst bei dem Prozess an.
Für die Reaktion auf Signale stehen Ihnen drei Möglichkeiten zur Verfügung, von denen Sie zwei selbst beeinflussen können (siehe Abbildung 7.1):
|
Sie reagieren gar nicht und lassen die vom Kernel vordefinierte Standardaktion ausführen. |
|
Sie ignorieren das Signal, damit es gar nicht erst beim Prozess ankommt (was allerdings bei den Signalen SIGKILL und SIGSTOP nicht möglich ist). |
|
Sie fangen das Signal ab und reagieren mit einer entsprechenden Routine darauf. |
Signale treten vorwiegend bei Programmfehlern (unerlaubter Speicherzugriff mit einem Zeiger, ungültige Instruktionen, Division durch null ...) auf oder werden vom Benutzer selbst ausgelöst. Bspw. können Sie mit der Tastenkombination (Strg)+(C) (= SIGINT) oder (Strg)+(Z) (= SIGTSTP) einen Prozess in der aktuellen Shell beenden bzw. anhalten.
Einen Überblick zu den Signalen auf Ihrem System erhalten Sie in der Kommandozeile mit kill –l (kleines L). In der Tabelle 7.1 bis Tabelle 7.7 (aufgeteilt nach Themen der Signale) finden Sie eine Auflistung der Signale (mitsamt deren Nummern und Standardaktionen) und ihrer Bedeutung. Allerdings gilt die hier gezeigte Übersicht nur für Intel- und PPC-Prozessor-Systeme. Sparc- und Alpha- oder MIPS-Prozessor-basierte Systeme haben zumindest zum Teil eine andere Signalnummer. Die Nummern weichen auch unter FreeBSD ab – hier scheinen die Systeme eigene Süppchen zu kochen. Ein weiterer Grund, den symbolischen Namen statt der Nummer zu verwenden.
Tabelle 7.1
Signale, die meist bei Programmfehlern auftreten
Name
|
Nr.
|
Aktion
|
Verfügbar
|
Bedeutung
|
SIGILL
|
4
|
Core & Ende
|
POSIX
|
Ungültige Instruktion wurde ausgeführt.
|
SIGTRAP
|
5
|
Core & Ende
|
|
Unterbrechung (Einzelschrittausführung)
|
SIGABRT
|
6
|
Core & Ende
|
POSIX
|
Abnormale Beendigung
|
SIGBUS
|
7
|
Core & Ende
|
|
Fehler auf dem System-Bus
|
SIGFPE
|
8
|
Core & Ende
|
POSIX
|
Problem bei einer Gleitkommaoperation (z. B. Teilung durch null)
|
SIGSEGV
|
11
|
Core & Ende
|
POSIX
|
Speicherzugriff auf unerlaubtes Speichersegment
|
SIGSYS
|
31
|
Core & Ende
|
|
Ungültiges Argument bei System-Call
|
SIGEMT
|
|
Ende
|
|
Emulations-Trap
|
SIGIOT
|
|
Core & Ende
|
|
Wie SIGABRT
|
Tabelle 7.2
Signale, die den Prozess beenden
Name
|
Nr.
|
Aktion
|
Verfügbar
|
Bedeutung
|
SIGHUP
|
1
|
Ende
|
POSIX
|
Abbruch einer Dialogstationsleitung bzw. Konfiguration neu laden für Dämonen
|
SIGINT
|
2
|
Ende
|
POSIX
|
Interrupt der Dialogstation ((Strg)+(C))
|
SIGQUIT
|
3
|
Core & Ende
|
POSIX
|
Das Signal quit von einer Dialogstation
|
SIGKILL
|
9
|
Ende
|
POSIX
|
Das Signal kill
|
SIGTERM
|
15
|
Ende
|
POSIX
|
Programme, die SIGTERM abfangen, bieten meistens einen »Soft Shutdown« an.
|
Tabelle 7.3
Signale, die bei Beendigung eines Timers auftreten – Alarm
Name
|
Nr.
|
Aktion
|
Verfügbar
|
Bedeutung
|
SIGALRM
|
14
|
Ende
|
POSIX
|
Zeituhr ist abgelaufen – alarm().
|
SIGVTALRM
|
26
|
Ende
|
BSD, SVR4
|
Der virtuelle Wecker ist abgelaufen.
|
SIGPROF
|
27
|
Ende
|
|
Timer zur Profileinstellung ist abgelaufen.
|
Tabelle 7.4
Asynchrone E/A-Signale
Name
|
Nr.
|
Aktion
|
Verfügbar
|
Bedeutung
|
SIGURG
|
23
|
Ignoriert
|
BSD, SVR4
|
Dringender Socketstatus ist eingetreten.
|
SIGIO
|
29
|
Ignoriert
|
BSD, SVR4
|
Socket E/A ist möglich.
|
SIGPOLL
|
|
Ende
|
SVR4
|
Ein anstehendes Ereignis bei Streams wird signalisiert.
|
Tabelle 7.5
Signale zur Prozesskontrolle
Name
|
Nr.
|
Aktion
|
Verfügbar
|
Bedeutung
|
SIGCHLD
|
17
|
Ignoriert
|
POSIX
|
Der Kind-Prozess wurde beendet oder angehalten.
|
SIGCONT
|
18
|
Ignoriert
|
POSIX
|
Ein angehaltener Prozess soll weiterlaufen.
|
SIGSTOP
|
19
|
Anhalten
|
POSIX
|
Der Prozess wurde angehalten.
|
SIGTSTP
|
20
|
Anhalten
|
POSIX
|
Der Prozess wurde »von Hand« mit STOP angehalten.
|
SIGTTIN
|
21
|
Anhalten
|
POSIX
|
Prozess wollte aus einem Hintergrundprozess der Kontroll-Dialogstation lesen.
|
SIGTTOU
|
22
|
Anhalten
|
POSIX
|
Prozess wollte in einem Hintergrundprozess der Kontroll-Dialogstation schreiben.
|
SIGCLD
|
|
Ignoriert
|
|
Wie SIGCHLD
|
Tabelle 7.6
Signale, die bei Fehlern einer Operation ausgelöst werden
Name
|
Nr.
|
Aktion
|
Verfügbar
|
Bedeutung
|
SIGPIPE
|
13
|
Ende
|
POSIX
|
Es wurde in eine Pipe geschrieben, aus der niemand liest. Es wurde versucht, in eine Pipe mit O_NONBLOCK zu schreiben, aus der keiner liest.
|
SIGLOST
|
|
Ende
|
|
Eine Dateisperre ging verloren.
|
SIGXCPU
|
24
|
Core & Ende
|
BSD, SVR4
|
Maximale CPU-Zeit wurde überschritten.
|
SIGXFSZ
|
25
|
Core & Ende
|
BSD, SVR4
|
Maximale Dateigröße wurde überschritten.
|
Tabelle 7.7
Die restlichen Signale
Name
|
Nr.
|
Aktion
|
Verfügbar
|
Bedeutung
|
SIGUSR1
SIGUSR2
|
10, 12
|
Ende
|
POSIX
|
Frei zur eigenen Benutzung
|
SIGWINCH
|
28
|
Ignoriert
|
BSD
|
Window-Größe hat sich verändert.
|
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|