Signale sind eine Möglichkeit zur Interprozesskommunikation. Vom Kernel verwendet, dienen sie dazu, Prozesse über bestimmte Ereignisse zu informieren; der Nutzer bedient sich ihrer, um hängen gebliebene Prozesse abzubrechen oder diese anzuweisen, ihre Konfigurationsdateien neu einzulesen.
Die Nutzersignale unterliegen bestimmten Restriktionen, sie dürfen nur an dem Nutzer zugeordnete Prozesse versandt werden. Nicht einmal root hat dem init-Prozess etwas zu sagen.
Signal | Nummer | Aktion |
SIGHUP | 1 | Terminal-Hangup, bei Dämonen verwendet, um ein erneutes Einlesen der Konfigurationsdateien zu erzwingen |
SIGINT | 2 | Tastatur-Interrupt |
SIGQUIT | 3 | Ende von der Tastatur |
SIGILL | 4 | Illegaler Befehl |
SIGABRT | 5 | Abbruch-Signal von abort(3) |
SIGFPE | 8 | Fließkommafehler (z.B. Division durch Null) |
SIGKILL | 9 | Unbedingte Beendigung eines Prozesses |
SIGSEGV | 11 | Speicherzugrifffehler |
SIGPIPE | 13 | Schreiben in eine Pipe, ohne dass ein Prozess daraus liest |
SIGTERM | 15 | Prozess soll sich beenden (default von kill) |
SIGCHLD | 17 | Ende eines Kindprozesses |
SIGCONT | 18 | Gestoppter Prozess wird fortgesetzt |
SIGSTP | 20 | Ausgabe wurde angehalten |
SIGUSR1 | 30 | Nutzerdefiniertes Signal |
Die genaue Zuordnung zwischen symbolischem Signal und Nummer ist in Linux in der Datei /usr/include/linux/asm/signal.h zu finden.
Zum manuellen Versenden von Signalen dienen die beiden Kommandos kill
und
killall
. kill
erwartet im Argument die ID des Prozesses,
während killall
den Namen des Programmes verlangt. Beide Kommandos verstehen die Signalangabe in numerischer
(1
für SIGHUP
,..., 9
für SIGKILL
,...) als auch in symbolischer
(HUP
für SIGHUP
,..., KILL
für SIGKILL
,...) Form.
Als Beispiel nehmen wir an, der "Netscape" reagiere nicht mehr (was leider keine hypothetische Annahme darstellt). Also werden wir den entsprechenden Prozess per Hand beenden:
# mittels killall auf die höfliche Tour
|