In Betriebssystemen die den Mehrprogrammbetrieb erlauben muss es eine Möglichkeit geben Prozesse zu erzeugen. In Regel wird es nicht möglich sein beim Start des Computersystems bereits sämtliche notwendigen Prozesse zu erzeugen. D.h. es müssen während der Laufzeit des Computersystems neue Prozesse erzeugt werden können. In dem Betriebssystem Unix gibt es dazu den Systemaufruf fork. Der fork-Aufruf erzeugt eine identische Kopie des Vater-Prozesses (Prozess in dem der fork-Aufruf erfolgt). Die Kopie wird dementsprechend Kind-Prozess genannt. Vater- und Kind-Prozess werden dann parallel weiter ausgeführt. Der Rückgabe-Wert des Systemaufrufs fork ist im Vater-Prozess die neue Prozess-ID, während im Kind-Prozess dieser Wert auf 0 gesetzt ist.
Abbildung
zeigt, wie in einem Standard-Unix-System die Prozesse
aufgebaut werden.
Nach erfolgten fork gibt es verschiedene Möglichkeiten des weiteren Ablaufs:
In Unix gibt es zu Laden von neuem Code den Befehl execlp. Dieser Befehl lädt einen anderen Code und beginnt mit seiner Ausführung.
Wenn der Kind-Prozess beendet wird, gibt er einen Rückgabewert an den Vater-Prozess. Das führt zu einem weiteren Problem, wenn der Vater-Prozess vor dem Kind-Prozess beendet wird. Es gibt die Möglichkeit mit dem wait-Systemaufruf auf die Beendigung des Kind-Prozesses oder der Kind-Prozesse zu warten. Wenn kein wait angegeben ist, so erhält der Kind-Prozess in Unix den Init-Prozess als neuen Vater-Prozess.
Zur Veranschaulichung dieser Vorgänge betrachten wir folgendes
C-Programm (Abbildung
). Zunächst wird ein neuer
Prozess erzeugt. Dann wird der
Code des Listbefehls ls im Kind-Prozess geladen. Im Vater-Prozess wird
auf die Beendigung des Kind-Prozesses gewartet, bevor auch dieser beendet wird.