Für alle die kein Bock auf Pipes oder so haben:

Weil ichs grade gefunden hab.

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Für alle die kein Bock auf Pipes oder so haben:
pid_t vfork (void) Gib einen schön leichtgewichtigen Prozess. (Oder hab ich da was nicht verstanden?)


nein, nein
vfork() wurde in Berkeley UNIX eingefuehrt, weil die Standardanwendung
fork und dann gleich exec
absolut unwirtschaftlich war.
Urspruenglich hatte man ja tatsaechlich alle Segmente kopiert um sie im rahmen
von exec dann gleich wieder wegzuwerfen.
vfork() laesst den Sohnprozess dagegen auf dem Speicher vom Vater laufen
und suspendiert den Vater so lange, bis der Sohn entweder exec aufruft
(und dabei die “geliehenen” Segmente nicht wegwirft, sondern sie dem Vater
zurueckgibt - oder bis er exit macht).
Das macht die ganze Anegelegenheit natuerlich erheblich effizenter.

Durch Erfindung und Einfuehrung von “copy-on-write”-Techniken
ist man von vfork wieder abgekommen (fork kopiert da naemlich auch
nciht, sondern die Segemente - bzw. die Seiten der Segmente - werden
einfach bei Vater und Sohn als “read-only” markiert. Wenn dann einer von beiden
tatsaechlich Daten modifiziert, gibt’s einen Segmentation fault der aber
innerhalb des Betiebssystems dadurch repariert wird, dass die betroffene Seite
kopiert wird und Vater und Sohn jeweils eine eigene Version read/write in ihre
logischen Adressraeume gemappt bekommen.
Wenn der Sohn exec oder exit macht, bekommt der Vater auch wieder alles
bis dahin gemeinsam genutzte mit read/write-Recht zurueck.

Vorteil von vfork ist, dass nicht mal die page tables kopiert werden muessen
(das ist ja haeufig auch schon eine ganze menge Zeug).
Der grosse Nachteil von vfork ist, dass alle Aenderungen die der Sohn auf dem
Speicher macht fuer den Vater sichtbar werden. Und wenn der Sohn ein return aus
der Funktion macht, in der vfork() aufgerufen wurde, dann zermuellt er dem Vater
evtl. den ausgeliehenen Stack (und wenn der ihn dann zuruckbekommt faellt er auf
die Schnautze).

Also vfork ist nur was fuer Leute, die genau wissen was sie tun (und wer weiss das
schon :slight_smile: )