Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

exec(2)

exit(2)

fork(2)

ioctl(2)

wait(2)

unistd(4)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026