vfork(2) vfork(2)
NAME
vfork - Neuen Prozeß im virtuellen Speicher erzeugen
SYNTAX
#include <unistd.h>
pidt vfork(void);
BESCHREIBUNG
vfork() kann dazu verwendet werden, um neue Prozesse zu erzeugen, ohne
daß der komplette Adreßbereich des alten Prozesses kopiert wird. Dies
ist nützlich, wenn der Zweck von fork() darin besteht, einen neuen
Systemkontext für einen execve()-Aufruf zu erzeugen. vfork() unter-
scheidet sich von fork() darin, daß sich der Sohnprozeß den Speicher
und die Kontrollstrukturen des Vaterprozesses ausleiht, bis ein
execve()-Aufruf oder eine Beendigung (sei es durch exit() oder auf
andere Weise) auftritt. Der Vaterprozeß wird angehalten, während der
Sohnprozeß dessen Ressourcen verwendet.
vfork() liefert 0 im Kontext des Sohnprozesses zurück und (später) die
Prozeß-ID (PID) des Sohnprozesses im Kontext des Vaterkontextes.
vfork() kann normalerweise genau wie fork() verwendet werden. Dies
funktioniert nicht, wenn der Kontext des Sohnprozesses ausgeführt wird
und aus der Routine zurückgesprungen werden soll, welche vfork() auf-
gerufen hat, da die Rückkehr von vfork() auf einen nicht mehr vorhan-
denen Stack-Rahmen treffen würde. Seien Sie also vorsichtig, rufen Sie
eher exit() als exit() auf, wenn Sie nicht execve() aufrufen können,
weil exit() die E/A-Kanäle verarbeitet und schließt und daher die
E/A-Datenstrukturen des Vaterprozesses zerstört. Selbst bei fork() ist
der Aufruf von exit() falsch, da gepufferte Daten doppelt verarbeitet
werden.
ERGEBNIS
Nach erfolgreicher Ausführung liefert vfork() den Wert Null an den
Sohnprozeß und die Prozeß-ID des Sohnprozesses an den Vaterprozeß
zurück. Ansonsten wird -1 an den Vaterprozeß zurückgeliefert, und es
wird kein Sohnprozeß erzeugt; die globale Variable errno enthält die
Fehlernummer.
FEHLER
Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
errno(5).
vfork() schlägt fehl und kein Sohnprozeß wird erzeugt, wenn eine oder
mehrere der folgenden Bedingungen erfüllt sind:
EAGAIN Die systembedingten Grenzen der maximal möglichen Prozesse
würden überschritten werden. Dieser Grenzwert wird festge-
legt, wenn das System erzeugt wird.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
vfork(2) vfork(2)
ENOMEM Der Swap-Bereich ist für den neuen Prozeß nicht groß genug.
ANWENDUNGSZWECK
Bei einigen Systemen entspricht die Funktion vfork() der Funktion
fork().
Die Funktion vfork() unterscheidet sich von fork() nur darin, daß der
Sohnprozeß den Code und die Daten mit dem aufrufenden Prozeß (Vater-
prozeß) gemeinsam verwenden kann. Dies beschleunigt zwar die Kopierak-
tivität erheblich, allerdings mit dem Risiko, daß die Integrität des
Vaterprozesses bei inkorrekter Verwendung von vfork() gefährdet ist.
Die Verwendung von vfork() für einen anderen Zweck als als Vorstufe zu
einem direkt folgenden Aufruf einer Funktion aus der exec-Familie oder
von exit() wird nicht empfohlen.
Die Funktion vfork() kann zur Erstellung neuer Prozesse verwendet wer-
den, ohne daß der gesamte Adreßbereich des alten Prozesses kopiert
wird. Wenn ein mit fork() erstellter Prozeß einfach nur exec aufruft,
wird der Datenbereich, der von fork() vom Vater- auf den Sohnprozeß
kopiert wurde, nicht verwendet. Dies ist besonders bei einem System
mit Paging-Mechanismus nicht sehr effizient, in dem sich vfork()
besonders anbietet. Abhängig von der Größe des Datenbereichs des
Vaterprozesses kann vfork() eine erhebliche Leistungssteigerung gegen-
über fork() bieten.
Wenn im Sohnprozeß nach vfork() Signalbehandlungsroutinen aufgerufen
werden, müssen diese dieselben Regeln wie anderer Code im Sohnprozeß
beachten.
[vfork, exec] beginnt mit dem Aufruf vfork() und endet, wenn der Sohn-
prozeß seinen exec-Aufruf ausgeführt hat.
SIEHE AUCH
exec(2), exit(2), fork(2), ioctl(2), wait(2), unistd(4).
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98