8.7 Signale an andere Prozesse senden – kill()
Mit der Funktion kill() können Sie Signale an andere Prozesse senden. Richtig eingesetzt, kann mit dieser Funktion aber auch mehr erreicht werden, als wie gewöhnlich in der Konsole Prozesse zu beenden. Ein Beispiel, das hier gleich demonstriert werden soll, wäre das Synchronisieren von zwei Prozessen (Eltern- und Kindprozess). Zuerst die Syntax von kill():
int kill (pid_t pid, int sig_nr) ;
Damit senden Sie das Signal sig_nr an einen Prozess, der mit pid spezifiziert wird. Eine Besonderheit ist es, wenn Sie hier für das Signal sig_nr die 0 verwenden. Damit können Sie überprüfen, ob an den Prozess oder die Prozessgruppe mit der pid überhaupt ein Signal geschickt werden kann. Kann kein Signal an den Prozess geschickt werden, liefert kill() als Rückgabewert -1 zurück – was auch für jeden anderen Fehler der Funktion zutrifft. Bei Erfolg gibt kill() immer 0 zurück. Häufig wird -1 zurückgegeben, weil der Prozess mit der pid gar nicht mehr existiert.
Bei der Angabe von pid werden vier mögliche Angaben unterschieden:
Tabelle 8.8
Mögliche Angaben für pid bei kill() und deren Bedeutung
pid-Angabe
|
Bedeutung
|
pid > 0
|
Das Signal geht an den Prozess mit der Prozess-ID pid.
|
pid == 0
|
Das Signal erhalten alle Prozesse, welche die PGID (process group identification (number)) des aktuellen Prozesses tragen (dazu gehört natürlich auch der aktuelle Prozess).
|
pid < –1
|
Das Signal erhalten alle Prozesse, deren PGID gleich dem absoluten Wert von pid ist.
|
pid == –1
|
Alle Prozesse mit Ausnahme von init erhalten das Signal. Dass man dafür Superuser-Rechte benötigt, leuchtet ein.
|
Um ein Signal an andere Prozesse zu schicken, muss man natürlich auch entsprechende Rechte für den Prozess haben. Der Superuser darf logischerweise an alle Prozesse Signale senden. Bei allen anderen muss beim Sender die reale oder effektive User-ID identisch mit der realen oder effektiven User-ID des Empfängers sein. Ein spezieller Fall ist das Signal SIGCONT, das von jedem gesendet werden kann, der Teil derselben Session des Empfängers ist.
|