5    Prozesse in der Shell

»Unix is basically a simple operating system,
but you have to be a genius to understand the simplicity.«
(Dt. »Unix ist im Wesentlichen ein einfaches Betriebssystem,
es braucht allerdings ein Genie, um diese Einfachheit zu verstehen.«)
– Dennis Ritchie

Wenn von Prozessen die Rede ist, meint man in der Ausführung befindliche Programme. Prozesse wurden bereits in Kapitel 2 eingeführt. Nun wollen wir uns damit befassen, wie Prozesse in der Shell gesteuert werden können.

5.1    Sessions und Prozessgruppen

Jeder Prozess ist Mitglied einer Prozessgruppe. Wie der Name schon sagt, befinden sich ein oder mehrere Prozesse in solch einer Gruppe. Eine Prozessgruppe ist wiederum einer Prozess-Session untergeordnet (siehe Abbildung 5.1). Betrachten wir diese Gebilde nun einmal im Einzelnen.

Prozessgruppen werden – wie auch Prozesse – durch eine eindeutige Identifikationsnummer unterschieden, die sogenannte Prozessgruppen-ID (PGID). Prozessgruppen haben wiederum einen Prozessgruppenführer. Dieser ist einer Session zugeordnet.

Eine sogenannte Session kann aus einer oder mehreren Prozessgruppen bestehen. Wie auch bei Prozessgruppen haben Sessions einen Sessionführer. Dies kann beispielsweise eine Shell oder auch ein Daemonprozess sein. Ein Sessionführer richtet die Verbindung zum Kontrollterminal ein und wird daher als Kontrollprozess bezeichnet.

Eine Session mit zwei Prozessgruppen

Abbildung 5.1     Eine Session mit zwei Prozessgruppen

Ein Beispiel

Zum besseren Verständnis hier ein Beispiel: Eine Benutzerin meldet sich am System an, ihre Shell startet. Die Shell wird Sessionführer und nimmt die Eingaben der Benutzerin entgegen.

Würde die Benutzerin nun beispielsweise die in Kapitel 4, »Grundlagen der Shell«, beschriebene Pipe (|) nutzen und die Ausgabe eines Programms als Eingabe für ein anderes verwenden, würden diese beiden Programme (ls und grep, siehe Abschnitt 6.2) eine Prozessgruppe bilden:

$ ls | grep ".txt"
hallo.txt
$

Listing 5.1     Filter: Beispiel für eine einfache Prozessgruppe

Das nächste Beispiel würde die Ausgabe von ls nach dem Muster ».txt« filtern und alle Textdateien aus dem aktuellen Verzeichnis anzeigen.

$ ls *.txt
hallo.txt
$

Listing 5.2     Eine Prozessgruppe mit nur einem Mitglied

Mit der Eingabe aus dem zweiten Listing würde ein Benutzer dasselbe Ergebnis erzielen, jedoch mit nur einem Prozess. Das spart dem Kernel Aufwand. Und da das Filtern bei der Verzeichnisausgabe recht oft nötig ist, wurde das Feature kurzerhand in ls implementiert.

Würden nun beide Prozessgruppen parallel ablaufen, indem wir eine Prozessgruppe in den Hintergrund packen (siehe folgender Abschnitt), so würden beide Prozessgruppen derselben Session angehören.