Ich verstehe die Unterschiede zwischen fork, vfork, exec, execv, execp. Also pls schimpfen nicht darüber. Meine Frage betrifft das Design der Unix-Prozess-Erstellung. Warum haben die Designer gedacht, dass sie zwei getrennte Aufrufe (fork und exec) erstellen, anstatt einen engen Anruf (spawn) zu halten. War ein gutes API-Design ein Grund dafür, dass Entwickler mehr Kontrolle über die Erstellung von Prozessen hatten? Aus Gründen der Leistung, so dass wir die Zuweisung der Prozesstabelle und anderer Kernel-Strukturen an das Kind verzögern können, bis entweder "Copy-on-Write" oder "Copy-on-Access" erstellt wurde?
Der Hauptgrund ist wahrscheinlich, dass die Trennung der Schritte fork()
und exec()
die willkürliche Einrichtung der untergeordneten Umgebung unter Verwendung anderer Systemaufrufe ermöglicht. Zum Beispiel können Sie:
... und viele mehr. Wenn Sie diese Aufrufe in einem einzigen spawn()
-Aufruf kombinieren würden, müsste es eine sehr komplexe Schnittstelle haben, um alle diese möglichen Änderungen an der Umgebung des Kindes zu kodieren - und wenn Sie jemals eine neue Einstellung hinzugefügt haben, dann Schnittstelle müsste geändert werden. Auf der anderen Seite können Sie in den separaten Schritten fork()
und exec()
die normalen Systemaufrufe ( open()
, close()
, dup()
, fcntl()
, ...) verwenden, um die Umgebung des Kindes vorher zu bearbeiten der Code%. Neue Funktionalität (zB exec()
) wird einfach unterstützt.
fork und exec machen ganz andere Dinge.
Es gibt viele Gründe, eins ohne das andere zu verwenden. Sie können untergeordnete Prozesse abzweigen, die Aufgaben im Auftrag Ihrer übergeordneten Steuer-App ausführen, z. B. ziemlich häufig in der Unix-Welt. Und Sie können z.B. Richte die Voraussetzungen für eine andere schrullige Anwendung ein und führe sie dann aus deiner Launcher-Anwendung aus, ohne jemals fork zu verwenden.
AFAIK, anfangs gab es nur fork (). Aus Performancegründen wurde jedoch die Erstellung von exec () gefordert, die die Kernelstrukturen, die sofort überschrieben werden, nicht neu erstellt. & lt; - Das ist falsch.
Es gibt ein Leistungsproblem, wenn ein Prozess einen untergeordneten Prozess erstellen muss, der keine Kopie von sich selbst ist. Ein fork () kopiert prozessbezogene Kernel-Daten, die sofort durch exec () ersetzt werden. Daher wurde vfork () eingeführt, das keine exzessiven Kernel-Daten und keine Prozessdaten kopiert. danach wird erwartet, dass ein Prozess etwas wie exec () anruft, und der Elternteil wird suspendiert, bis das Kind dies tut. Im Abschnitt "Fehler" finden Sie jedoch eine Beschreibung der Probleme mit vfork ().
fork () kann nur zum Erstellen eines untergeordneten Prozesses verwendet werden. Es kann nur eine Replikation des übergeordneten Elements durchgeführt werden. Während exec () verwendet werden kann, um jeden neuen Prozess auf dem System zu starten. Ich sehe keine Korrelation über zwei.