Es ist die Schnittstelle zu vereinfachen. Die Alternative zu fork
und exec
wäre so etwas wie die CreateProcess- Funktion von Windows . Beachten Sie, wie viele Parameter vorhanden CreateProcess
sind, und viele davon sind Strukturen mit noch mehr Parametern. Dies liegt daran, dass alles , was Sie über den neuen Prozess steuern möchten, übergeben werden muss CreateProcess
. In der Tat, CreateProcess
nicht genügend Parameter, so Microsoft hinzufügen hatte CreateProcessAsUser und CreateProcessWithLogonW .
Mit dem fork/exec
Modell benötigen Sie nicht alle diese Parameter. Stattdessen bleiben bestimmte Attribute des Prozesses übergreifend erhalten exec
. Auf diese Weise können Sie die fork
gewünschten Prozessattribute ändern (mit denselben Funktionen, die Sie normalerweise verwenden würden) und dann exec
. Hat unter Linux fork
keine Parameter und execve
nur 3: das auszuführende Programm, die Befehlszeile und seine Umgebung. (Es gibt noch andere exec
Funktionen, aber sie sind nur Wrapper, execve
die von der C-Bibliothek bereitgestellt werden, um allgemeine Anwendungsfälle zu vereinfachen.)
Wenn Sie einen Prozess mit einem anderen aktuellen Verzeichnis starten: fork
, chdir
, exec
.
Wenn Sie möchten , Umleitung stdin / stdout: fork
, Schließen / Öffnen von Dateien, exec
.
Wenn Sie Switch - Benutzer wollen: fork
, setuid
, exec
.
All diese Dinge können nach Bedarf kombiniert werden. Wenn jemand mit einer neuen Art von Prozess - Attribute aufkommt, müssen Sie nicht ändern fork
und exec
.
Wie bereits erwähnt, verwenden die meisten modernen Unixe Copy-on-Write, sodass fork
kein erheblicher Overhead anfällt .
fork(2)
Manpage unter Linux sagt:Under Linux, fork() is implemented using copy-on-write pages, so the only penalty that it incurs is the time and memory required to duplicate the parent's page tables, and to create a unique task structure for the child.
Ich stelle mir vor (weiß aber nicht genau), dass dies bei anderen modernen Unix-Varianten der Fall ist.