Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

fork - neuen Prozess erzeugen

&pagelevel(4)&pagelevel

Definition

#include <unistd.h>

Optional
#include <sys/types.h> (Ende)

pid_t fork(void);

Beschreibung

fork() erzeugt einen neuen Prozess. Der neue Prozess (Sohnprozess) ist in Bezug auf die folgenden Punkte eine exakte Kopie des aufrufenden Prozesses (Vaterprozess):

  • reale und effektive Benutzer- und Gruppennummern

  • Umgebung

  • sbe-Bit (siehe exec())

  • Signalaktionen (SIG_DFL, SIG_IGN, Adresse der Signalbehandlungsfunktion)

  • zusätzliche Gruppennummern

  • s-Bit für Eigentümer

  • s-Bit für Gruppe

  • Prioritätswert (siehe nice())

  • alle zugeteilten gemeinsam nutzbaren Speichersegmente (siehe shmat())

  • Prozessgruppennummer

  • Terminalnummer (siehe exit())

  • aktuelles Dateiverzeichnis

  • Root-Dateiverzeichnis

  • Schutzbitmaske (siehe umask())

  • Betriebsmittel-Grenzwerte (siehe getrlimit())

  • steuerndes Terminal

Der Sohnprozess unterscheidet sich vom Vaterprozess in folgenden Punkten:

  • Der Sohnprozess besitzt eine eigene eindeutige Prozessnummer. Die Sohnprozessnummer entspricht keiner aktiven Prozessgruppennummer.

  • Der Sohnprozess besitzt zusätzlich eine von der Sohnprozessnummer verschiedene Vaterprozessnummer (d.h. die Prozessnummer des Vaterprozesses).

  • Der Sohnprozess besitzt eine eigene Kopie des Vater-Dateideskriptors. Alle Dateideskriptoren des Sohnprozesses teilen die Dateibeschreibung des Vaterprozess-Dateideskriptors.

  • Der Sohnprozess besitzt eine eigene Kopie der Vater-Dateiverzeichnisströme. Alle Dateiverzeichnisströme des Sohnprozesses können den Lese-/Schreibzeiger mit dem entsprechenden Dateiverzeichnisstrom des Vaterprozesses teilen.

  • Der Sohnprozess kann eine eigene Kopie des Vater-Meldungskatalog-Deskriptors besitzen.

  • Die Werte des Sohnprozesses für die tms-Strukturkomponenten tms_utime, tms_-stime, tms_cutime und tms_cstime sind gleich 0 gesetzt (siehe times()).

  • Die Restzeit bis zu einem Alarmuhr-Signal ist gleich 0 gesetzt (siehe alarm()).

  • Alle semadj-Werte sind gelöscht (siehe semop()).

  • Dateisperren des Vaterprozesses werden vom Sohnprozess nicht geerbt (siehe auch fcntl()).

  • Die für den Sohnprozess anstehende Signalmenge wird mit der leeren Menge initialisiert.

Werden Threads verwendet, so wirkt sich die Funktion auf den Prozess oder auf einen Thread wie folgt aus:

  • Ein Prozess wird mit einem einzigen Thread erzeugt. Wenn ein ”multi-threaded” Prozess fork() aufruft, enthält der neue Prozess eine Kopie des aufrufenden Threads und seines gesamten Adressraums einschließlich des Zustands von Mutex-Objekten und anderen Ressourcen. Mit der Funktion pthread_atfork()können Fork-Handler eingerichtet werden.

BS2000

  • BS2000-Dateien, mit Ausnahme von Memory-Pools, werden mit fork() nicht vererbt. Außerdem werden die folgenden BS2000-Ressourcen nicht vererbt:

    • offene BS2000-Dateien sind nicht mehr offen

    • AID-Haltepunkte

    • Task File Table (TFT)

    • SYSFILE-Zuweisungen

    • angemeldete STXIT- und Contingency-Routinen (Ende)

Returnwert

0

bei erfolgreicher Beendigung. Dieser Returnwert wird an den Sohnprozess und die Prozessnummer des Sohnprozesses an den Vaterprozess zurückgeliefert.

 

-1

bei Fehler. Dieser Returnwert wird an den Vaterprozess zurückgeliefert; es wird kein Sohnprozess erzeugt. errno wird gesetzt, um den Fehler anzuzeigen.

Fehler

fork() schlägt fehl, wenn gilt:

 

EAGAIN

Das System hat nicht genügend Ressourcen, um einen weiteren Prozess zu erzeugen. Die systembedingte Grenze für die Anzahl der systemweit oder für eine einzelne Benutzernummer gleichzeitig ablaufenden Prozesse {CHILD_MAX} würde überschritten werden,
oder wenn im Vaterprozess DIV- oder FASTRAM-Bereiche abgelegt sind.


Erweiterung

 

ENOMEM

Der Swap-Bereich ist zu klein. (Ende)

Hinweise

fork() kann ab dieser Version auch in Signalbehandlungs- und Contingency-Routinen verwendet werden.

Siehe auch

alarm(), exec, fcntl(), semop(), signal(), times(), sys/types.h, unistd.h.