Der UNIX-Systemaufruf für die Prozesserstellung, fork(), erstellt einen untergeordneten Prozess, indem er den übergeordneten Prozess kopiert. Nach meinem Verständnis folgt darauf fast immer ein Aufruf von exec(), um den Speicherplatz des untergeordneten Prozesses (einschließlich Textsegment) zu ersetzen. Das Kopieren des Speicherplatzes des übergeordneten Elements in fork() erschien mir immer verschwenderisch (obwohl mir klar ist, dass die Verschwendung minimiert werden kann, indem die Speichersegmente Copy-on-Write gemacht werden, sodass nur Zeiger kopiert werden). Wie auch immer, weiß jemand, warum dieser Duplizierungsansatz für die Prozesserstellung erforderlich ist?
Akzeptierte Antwort:
Es soll die Schnittstelle vereinfachen. Die Alternative zu fork
und exec
wäre so etwas wie die CreateProcess-Funktion von Windows. Beachten Sie, wie viele Parameter CreateProcess
hat, und viele von ihnen sind Strukturen mit noch mehr Parametern. Denn alles Vielleicht möchten Sie die Kontrolle über den neuen Prozess an CreateProcess
übergeben . Tatsächlich CreateProcess
hat nicht genügend Parameter, also musste Microsoft CreateProcessAsUser und CreateProcessWithLogonW hinzufügen.
Mit fork/exec
Modell, benötigen Sie nicht alle diese Parameter. Stattdessen werden bestimmte Attribute des Prozesses über exec
beibehalten . Dadurch können Sie fork
, ändern Sie dann die gewünschten Prozessattribute (mit den gleichen Funktionen, die Sie normalerweise verwenden würden) und dann exec
. Unter Linux fork
hat keine Parameter und execve
hat nur 3:das auszuführende Programm, die ihm zu gebende Befehlszeile und seine Umgebung. (Es gibt andere exec
Funktionen, aber sie sind nur Wrapper um execve
wird von der C-Bibliothek bereitgestellt, um allgemeine Anwendungsfälle zu vereinfachen.)
Wenn Sie einen Prozess mit einem anderen aktuellen Verzeichnis starten möchten:fork
, chdir
, exec
.
Wenn Sie stdin/stdout umleiten möchten:fork
, Dateien schließen/öffnen, exec
.
Wenn Sie den Benutzer wechseln möchten:fork
, setuid
, exec
.
All diese Dinge können nach Bedarf kombiniert werden. Wenn sich jemand eine neue Art von Prozessattribut einfallen lässt, müssen Sie fork
nicht ändern und exec
.
Wie larsks erwähnte, verwenden die meisten modernen Unixes Copy-on-Write, also fork
verursacht keinen nennenswerten Mehraufwand.