fork(2) erzeugt einen Kindprozess

ÜBERSICHT

#include <unistd.h>

pid_t fork(void);

BESCHREIBUNG

fork() erzeugt einen neuen Prozess, indem der aufrufende Prozess dupliziert wird. Der neue Prozess wird als das Kind bezeichnet. Er ist bis auf die folgenden Punkte eine exakte Kopie des aufrufenden Prozesses (Parent):

Der Kindprozess und der Elternprozess laufen in separaten Speicherbereichen. Zum Zeitpunkt von fork() haben beide Speicherbereiche den gleichen Inhalt. Speicherschreibvorgänge, Dateizuordnungen (mmap(2)) und die Lösung von Zuordnungen (munmap(2)) eines Prozesses beeinflussen den jeweiligen anderen Prozess nicht.

Der Kindprozess ist ein exaktes Duplikat des Elternprozesses, mit folgenden Ausnahmen:

*
Das Kind hat seine eigene eindeutige Prozess-ID, die mit keiner ID irgendeiner existierenden Prozessgruppe übereinstimmt (setpgid(2)).
*
Die Parent-Prozess-ID des Kindes ist die gleiche wie die Prozess-ID des Parent-Prozesses.
*
Das Kind erbt keine Speichersperren des Parent-Prozesses (mlock(2), mlockall(2)).
*
Für das Kind wird die Nutzung von Prozessressourcen (getrusage(2)) und Zähler für CPU-Zeiten (times(2)) auf null zurückgesetzt.
*
Die Menge der für das Kind anstehenden Signale ist anfangs leer (sigpending(2)).
*
Das Kind erbt keine Semaphor-Einstellungen von seinem Parent (semop(2)).
*
The child does not inherit process-associated record locks from its parent (fcntl(2)). (On the other hand, it does inherit fcntl(2) open file description locks and flock(2) locks from its parent.)
*
Das Kind erbt keine Timer von seinem Parent (setitimer(2), alarm(2), timer_create(2)).
*
Das Kind erbt keine ausstehenden asynchronen E/A-Operationen von seinem Parent (aio_read(3), aio_write(3)), auch asynchrone E/A-Kontexte des Parents werden nicht vererbt (siehe io_setup(2)).

Die Prozessattribute in der vorstehenden Liste werden allesamt in POSIX.1 beschrieben. Parent und Kind unterscheiden sich auch in den folgenden Linux-spezifischen Prozessattributen:

*
Das Kind erbt keine Nachrichten über Verzeichnisänderungen (directory change notifications, dnotify) von seinem Parent (siehe die Beschreibung von F_NOTIFY in fcntl(2)).
*
Die Einstellung PR_SET_PDEATHSIG von prctl(2) wird zurückgesetzt, sodass das Kind kein Signal empfängt, wenn sein Parent terminiert.
*
Der voreingestellte Wert für den Timer-Spielraum (»timer slack«) wird auf den aktuellen Timer-Spielraum des Parents gesetzt. Siehe die Beschreibung von PR_SET_TIMERSLACK in prctl(2).
*
Speicherabbildungen, die mit dem madvise(2)-Flag MADV_DONTFORK markiert wurden, werden nicht über einen Aufruf von fork() hinweg vererbt.
*
Das Terminierungssignal des Kindes ist immer SIGCHLD (siehe clone(2)).
*
Die von ioperm(2) gesetzten Bits für Portzugriffe werden nicht an das Kind vererbt, stattdessen muss das Kind benötigte Bits mittels ioperm(2) aktivieren.

Beachten Sie die folgenden weiteren Punkte:

*
Der Kindprozess wird mit einem einzigen Thread erstellt --- demjenigen, der fork aufrief. Der gesamte virtuelle Adressraum des Parents wird im Kind repliziert, einschließlich der Zustände der Mutexe, von Zustandsvariablen und anderer »pthread«- Objekten; die Verwendung von pthread_atfork(3) kann hilfreich sein für die Behandlung von dadurch verursachten Problemen.
*
After a fork(2) in a multithreaded program, the child can safely call only async-signal-safe functions (see signal(7)) until such time as it calls execve(2).
*
Das Kind erbt Kopien der Parent-Menge offener Dateideskriptoren. Jeder Deskriptor des Kindes bezieht sich auf die gleiche Beschreibung einer geöffneten Datei (siehe open(2)) wie der entsprechende Dateideskriptor im Parent. Dies bedeutet, dass die beiden Dateideskriptoren die Status-Flags geöffneter Dateien, den Datei-Offset und signalgesteuerte E/A-Attribute (siehe die Beschreibung von F_SETOWN und F_SETSIG in fcntl(2)) gemeinsam nutzen.
*
Das Kind erbt Kopien des Parent-Deskriptorenmenge für offene Nachrichten-Warteschlangen (siehe mq_overview(7))). Jeder Dateideskriptor des Kindes bezieht sich auf die gleiche Beschreibung einer geöffneten Nachrichten-Warteschlange wie der entsprechende Dateideskriptor im Parent. Das bedeutet, dass die beiden Dateideskriptoren die gleichen Flags (mq_flags) gemeinsam nutzen.
*
Das Kind erbt Kopien der Parent-Menge offener Verzeichnis-Streams (siehe opendir(3)). POSIX.1 besagt, dass die entsprechenden Verzeichnis-Streams auf die gleiche Position zeigen können; unter Linux/Glibc tun sie es nicht.

RÜCKGABEWERT

Bei Erfolg wird dem Parent die PID des Kindprozesses zurückgegeben und dem Kind 0 . Bei Fehlern wird dem Parent -1 zurückgegeben, kein Kindprozess erzeugt und errno entsprechend gesetzt.

FEHLER

EAGAIN

A system-imposed limit on the number of threads was encountered. There are a number of limits that may trigger this error: the RLIMIT_NPROC soft resource limit (set via setrlimit(2)), which limits the number of processes and threads for a real user ID, was reached; the kernel's system-wide limit on the number of processes and threads, /proc/sys/kernel/threads-max, was reached (see proc(5)); or the maximum number of PIDs, /proc/sys/kernel/pid_max, was reached (see proc(5)).

EAGAIN
The caller is operating under the SCHED_DEADLINE scheduling policy and does not have the reset-on-fork flag set. See sched(7).
ENOMEM
fork() konnte wegen Speicherknappheit die erforderlichen Kernel-Strukturen nicht anlegen.
ENOSYS
fork() wird auf dieser Plattform nicht unterstützt (beispielsweise Hardware ohne eine Memory-Management Unit).
ERESTARTNOINTR (seit Linux 2.6.17)
System call was interrupted by a signal and will be restarted. (This can be seen only during a trace.)

KONFORM ZU

POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

ANMERKUNGEN

Unter Linux ist fork() mittels »copy-on-write«-Seiten implementiert, sodass der einzige Nachteil von fork() die Zeit und der Speicher ist, der benötigt wird, um die Page Tables des Parents zu kopieren und eine eindeutige Task-Struktur für das Kind anzulegen.

Unterschiede C-Bibliothek/Kernel

Der Glibc-Wrapper für fork() wird als Teil der NPTL-Threading-Implementierung bereitgestellt. Seit Version 2.3.3 der Glibc ruft der fork()-Wrapper nicht mehr den Kernel-Systemaufruf fork() auf, sondern clone(2) mit Flags, die das Gleiche bewirken wie der traditionelle Systemaufruf. (Ein Aufruf von fork() ist gleichbedeutend mit einem Aufruf von clone(2), bei dem für flags nur SIGCHLD angegeben wird.) Der Glibc-Wrapper ruft alle Fork-Handler auf, die mittels pthread_atfork(3) eingerichtet wurden.

BEISPIEL

Siehe pipe(2) und wait(2).

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 4.06 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von FIXME: This file needs a review on debian-l10n-german, Martin Schulze <[email protected]>, Martin Eberhard Schauer <[email protected]> und Mario Blättermann <[email protected]> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <[email protected]>.