# Interprozesskommunikation

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 user@sonne> killall -15 netscape # reagiert Netscape immer noch nicht, dann auf die harte Tour user@sonne> killall -KILL netscape # mittels kill user@sonne> ps ax | grep netscape 887 tty1 S 2:12 /opt/netscape/netscape user@sonne> kill -9 887`