GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum ist der Standardprozesserstellungsmechanismus Fork?

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.


Linux
  1. Warum hat der Server meine IP blockiert?

  2. Neuer übergeordneter Prozess, wenn der übergeordnete Prozess stirbt?

  3. Der maximale Wert der Prozess-ID?

  4. Warum ist Python 2.7 immer noch die Standard-Python-Version in Ubuntu?

  5. Was ist das Standardpasswort des Bildschirms?

Der Unterschied zwischen fork(), vfork(), exec() und clone()

Warum ist das .bss-Segment erforderlich?

warum die Geschwisterliste verwendet wird, um die task_struct zu erhalten, während die Kinder eines Prozesses abgerufen werden

Warum führt das Forking meines Prozesses dazu, dass die Datei unendlich gelesen wird?

Warum verwendet sed nicht standardmäßig den erweiterten Regex-Modus?

Warum soll vfork() verwendet werden, wenn der untergeordnete Prozess exec() oder exit() unmittelbar nach der Erstellung aufruft?