Provided by: manpages-de-dev_1.4-1_all 

BEZEICHNUNG
fork - 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):
* 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.
* Der Satz für das Kind anstehender Signale ist anfangs leer (sigpending(2)).
* Das Kind erbt keine Semaphor-Einstellungen von seinem Parent (semop(2)).
* Das Kind erbt keine Datensatzsperren von seinem Parent (fcntl(2)).
* 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-2001 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.
* Das Kind erbt Kopien des Parent-Satzes von offenen 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 Deskriptoren die Status-Flags geöffneter
Dateien, den aktuellen 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-Deskriptorsatzes für offene Nachrichten-Warteschlangen. Jeder
Deskriptor des Kindes bezieht sich auf die gleiche Beschreibung einer geöffneten
Nachrichten-Warteschlange (siehe mq_overview(7)) wie der entsprechende Deskriptor im Parent. Das
bedeutet, dass die beiden Deskriptoren die gleichen Flags (mq_flags) gemeinsam nutzen.
* Das Kind erbt Kopien des Parent-Satzes für offene Verzeichnis-Streams (siehe opendir(3)). POSIX.1-2001
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 fork() kann nicht ausreichend Speicher allozieren, um die Page Tables des Parents zu kopieren und
einen Task-Record für den Kindprozess anzulegen.
EAGAIN Es war nicht möglich einen neuen Prozess zu erstellen, da die Ressourcen-Beschränkung
RLIMIT_NPROC des aufrufenden Prozesses überschritten wurde. Um diesen Wert zu vergrößern, muss der
Prozess über eine der Capabilitys CAP_SYS_ADMIN oder CAP_SYS_RESOURCE verfügen.
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).
KONFORM ZU
SVr4, 4.3BSD, POSIX.1-2001.
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.
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).
SIEHE AUCH
clone(2), execve(2), exit(2), setrlimit(2), unshare(2), vfork(2), wait(2), daemon(3), capabilities(7),
credentials(7)
KOLOPHON
This page is part of release 3.54 of the Linux man-pages project. A description of the project, and
information about reporting bugs, can be found at http://www.kernel.org/doc/man-pages/.
ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Schulze <joey@infodrom.org>, Martin
Eberhard Schauer <Martin.E.Schauer@gmx.de> und Mario Blättermann <mario.blaettermann@gmail.com> 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
<debian-l10n-german@lists.debian.org>.
Linux 12. März 2013 FORK(2)