Es ist die Schnittstelle zu vereinfachen. Die Alternative zu forkund execwäre so etwas wie die CreateProcess- Funktion von Windows . Beachten Sie, wie viele Parameter vorhanden CreateProcesssind, 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, CreateProcessnicht genügend Parameter, so Microsoft hinzufügen hatte CreateProcessAsUser und CreateProcessWithLogonW .
Mit dem fork/execModell benötigen Sie nicht alle diese Parameter. Stattdessen bleiben bestimmte Attribute des Prozesses übergreifend erhalten exec. Auf diese Weise können Sie die forkgewünschten Prozessattribute ändern (mit denselben Funktionen, die Sie normalerweise verwenden würden) und dann exec . Hat unter Linux forkkeine Parameter und execvenur 3: das auszuführende Programm, die Befehlszeile und seine Umgebung. (Es gibt noch andere execFunktionen, aber sie sind nur Wrapper, execvedie 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 forkund exec.
Wie bereits erwähnt, verwenden die meisten modernen Unixe Copy-on-Write, sodass forkkein 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.