Der UNIX-Systemaufruf zur Prozesserstellung, fork (), erstellt einen untergeordneten Prozess, indem der übergeordnete Prozess kopiert wird. Meines Wissens folgt darauf fast immer ein Aufruf von exec (), um den Speicherbereich des untergeordneten Prozesses (einschließlich Textsegment) zu ersetzen. Das Kopieren des Speicherplatzes der Eltern in fork () erschien mir immer verschwenderisch (obwohl mir klar ist, dass die Verschwendung minimiert werden kann, indem die Speichersegmente beim Schreiben kopiert werden, sodass nur Zeiger kopiert werden). Wie auch immer, weiß jemand, warum dieser Duplizierungsansatz für die Erstellung von Prozessen erforderlich ist?
process
process-management
fork
Ellen Spertus
quelle
quelle
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.select
kaputt waren, aber das ist eine andere Geschichte).Antworten:
Es ist die Schnittstelle zu vereinfachen. Die Alternative zu
fork
undexec
wäre so etwas wie die CreateProcess- Funktion von Windows . Beachten Sie, wie viele Parameter vorhandenCreateProcess
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 mussCreateProcess
. 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 erhaltenexec
. Auf diese Weise können Sie diefork
gewünschten Prozessattribute ändern (mit denselben Funktionen, die Sie normalerweise verwenden würden) und dannexec
. Hat unter Linuxfork
keine Parameter undexecve
nur 3: das auszuführende Programm, die Befehlszeile und seine Umgebung. (Es gibt noch andereexec
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
undexec
.Wie bereits erwähnt, verwenden die meisten modernen Unixe Copy-on-Write, sodass
fork
kein erheblicher Overhead anfällt .quelle
Zusätzlich zur Antwort des cjm definiert die Single Unix Specification eine Funktion mit dem Namen
vfork()
. Diese Funktion funktioniert wie Fork, außer dass der Fork-Prozess ein undefiniertes Verhalten aufweist, wenn er etwas anderes ausführt, als eine ausführbare Funktion aufzurufen oder aufzurufen_exit()
.So ziemlich die einzige Verwendung mit definiertem Verhalten ist:
Also, was macht
vfork
das? Es ist eine preiswertefork
. Bei Implementierungen ohne Copy-on-Write teilt sich der resultierende Prozess den Speicherplatz mit dem ursprünglichen Prozess (daher das undefinierte Verhalten). Bei Implementierungen mit Copy-on-Writevfork
darf identisch seinfork()
, da Copy-on-Write-Implementierungen schnell sind.Es gibt auch die optionale
posix_spawn
Funktion (und eineposix_spawnp
Funktion), mit der ein neuer Prozess direkt erstellt werden kann. (Es ist auch zulässig, sie mit einem Bibliotheksaufruf unter Verwendung vonfork
und zuexec
implementieren. Eine Beispielimplementierung wird bereitgestellt.)quelle