.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2006 Michael Kerrisk .\" A few fragments remain from an earlier (1992) page by .\" Drew Eckhardt (drew@cs.colorado.edu), .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" Modified by Michael Haardt (michael@moria.de) .\" Modified Sat Jul 24 13:22:07 1993 by Rik Faith (faith@cs.unc.edu) .\" Modified 21 Aug 1994 by Michael Chastain (mec@shell.portal.com): .\" Referenced 'clone(2)'. .\" Modified 1995-06-10, 1996-04-18, 1999-11-01, 2000-12-24 .\" by Andries Brouwer (aeb@cwi.nl) .\" Modified, 27 May 2004, Michael Kerrisk .\" Added notes on capability requirements .\" 2006-09-04, Michael Kerrisk .\" Greatly expanded, to describe all attributes that differ .\" parent and child. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH FORK 2 "9. Juni 2020" Linux Linux\-Programmierhandbuch .SH BEZEICHNUNG fork \- erzeugt einen Kindprozess .SH ÜBERSICHT \fB#include \fP .br \fB#include \fP .PP \fBpid_t fork(void);\fP .SH BESCHREIBUNG \fBfork\fP() erzeugt einen neuen Prozess, indem der aufrufende Prozess dupliziert wird. Der neue Prozess wird als das \fIKind\fP bezeichnet. Der aufrufende Prozess wird als \fIElternprozess\fP bezeichnet. .PP Der Kind\- und der Elternprozess laufen in separaten Speicherbereichen. Zum Zeitpunkt von \fBfork\fP() haben beide Speicherbereiche den gleichen Inhalt. Speicherschreibvorgänge, Datei\-Mappings (\fBmmap\fP(2)) und Aufhebung von Mappings (\fBmunmap\fP(2)) eines Prozesses beeinflussen den jeweiligen anderen Prozess nicht. .PP Der Kindprozess ist ein exaktes Duplikat des Elternprozesses, mit folgenden Ausnahmen: .IP * 3 Das Kind hat seine eigene eindeutige Prozesskennung, die mit keiner Kennung irgendeiner existierenden Prozessgruppe oder Sitzung übereinstimmt (\fBsetpgid\fP(2)). .IP * Die Elternprozesskennung des Kindes ist die gleiche wie die Prozesskennung des Elternprozesses. .IP * Das Kind erbt keine Speichersperren (\fBmlock\fP(2), \fBmlockall\fP(2)) des Elternprozesses. .IP * Für das Kind wird die Nutzung von Prozessressourcen (\fBgetrusage\fP(2)) und Zähler für CPU\-Zeiten (\fBtimes\fP(2)) auf null zurückgesetzt. .IP * Die Menge der für das Kind anstehenden Signale ist anfangs leer (\fBsigpending\fP(2)). .IP * Das Kind erbt keine Semaphore\-Einstellungen von seinem Elternprozess (\fBsemop\fP(2)). .IP * Das Kind erbt keine prozess\-zugeordneten Datensatzsperren von seinem Elternprozess (\fBfcntl\fP(2)). (Allerdings erbt es offene Dateideskriptionssperren von \fBfcntl\fP(2) und \fBflock\fP(2)\-Sperren von seinem Elternprozess.) .IP * Das Kind erbt keine Timer von seinem Elternprozess (\fBsetitimer\fP(2), \fBalarm\fP(2), \fBtimer_create\fP(2)). .IP * Das Kind erbt keine ausstehenden asynchronen E/A\-Operationen von seinem Elternprozess (\fBaio_read\fP(3), \fBaio_write\fP(3)), auch asynchrone E/A\-Kontexte des Elternprozesses werden nicht vererbt (siehe \fBio_setup\fP(2)). .PP Die Prozessattribute in der vorstehenden Liste werden allesamt in POSIX.1 beschrieben. Eltern\- und Kindprozess unterscheiden sich auch in den folgenden Linux\-spezifischen Prozessattributen: .IP * 3 Das Kind erbt keine Nachrichten über Verzeichnisänderungen (directory change notifications, dnotify) von seinem Elternprozess (siehe die Beschreibung von \fBF_NOTIFY\fP in \fBfcntl\fP(2)). .IP * Die Einstellung \fBPR_SET_PDEATHSIG\fP von \fBprctl\fP(2) wird zurückgesetzt, sodass das Kind kein Signal empfängt, wenn sein Elternprozess terminieren. .IP * Der voreingestellte Wert für den Timer\-Spielraum (»timer slack«) wird auf den aktuellen Timer\-Spielraum des Elternprozesses gesetzt. Siehe die Beschreibung von \fBPR_SET_TIMERSLACK\fP in \fBprctl\fP(2). .IP * Speicher\-Mappings, die mit dem \fBmadvise\fP(2)\-Schalter \fBMADV_DONTFORK\fP markiert wurden, werden nicht über einen Aufruf von \fBfork\fP() hinweg vererbt. .IP * Speicher in dem Adressbereich, der mit dem \fBmadvise\fP(2)\-Schalter \fBMADV_WIPEONFORK\fP markiert ist, wird nach einem \fBfork\fP() im Kind genullt. (Die Einstellung \fBMADV_WIPEONFORK\fP verbleibt für diese Adressbereiche im Kind.) .IP * Das Terminierungssignal des Kindes ist immer \fBSIGCHLD\fP (siehe \fBclone\fP(2)). .IP * Die von \fBioperm\fP(2) gesetzten Bits für Portzugriffe werden nicht an das Kind vererbt, stattdessen muss das Kind benötigte Bits mittels \fBioperm\fP(2) aktivieren. .PP Beachten Sie die folgenden weiteren Punkte: .IP * 3 Der Kindprozess wird mit einem einzigen Thread erstellt – demjenigen, der \fBfork\fP aufrief. Der gesamte virtuelle Adressraum des Elternprozesses wird im Kind repliziert, einschließlich der Zustände der Mutexe, Zustandsvariablen und anderer »pthread«\-Objekte; die Verwendung von \fBpthread_atfork\fP(3) kann für die Behandlung von dadurch verursachten Problemen hilfreich sein. .IP * Nach einem \fBfork\fP() in einem Multithread\-Programm kann das Kind sicher nur async\-signal\-safe\-Funktionen aufrufen (siehe \fBsignal\-safety\fP(7)), bis es \fBexecve\fP(2) aufruft. .IP * Das Kind erbt Kopien der Menge der offenen Dateideskriptoren des Elternprozesses. Jeder Deskriptor des Kindes bezieht sich auf die gleichen offenen Dateideskriptoren (siehe \fBopen\fP(2)) wie der entsprechende Dateideskriptor in dem Elternprozess. Dies bedeutet, dass die beiden Dateideskriptoren die Statusschalter geöffneter Dateien, den Datei\-Offset und signalgesteuerte E/A\-Attribute (siehe die Beschreibung von \fBF_SETOWN\fP und \fBF_SETSIG\fP in \fBfcntl\fP(2)) gemeinsam nutzen. .IP * Das Kind erbt Kopien der Menge der Deskriptoren des Elternprozesses für offene Nachrichten\-Warteschlangen (siehe \fBmq_overview\fP(7)). Jeder Dateideskriptor des Kindes bezieht sich auf die gleiche Nachrichtenwarteschlangendeskription wie der entsprechende Dateideskriptor in dem Elternprozess. Das bedeutet, dass die beiden Dateideskriptoren die gleichen Schalter (\fImq_flags\fP) gemeinsam nutzen. .IP * Das Kind erbt Kopien der Menge der offenen Verzeichnis\-Streams des Elternprozesses (siehe \fBopendir\fP(3)). POSIX.1 besagt, dass die entsprechenden Verzeichnis\-Streams auf die gleiche Position zeigen \fIkönnen\fP; unter Linux/Glibc tun sie es nicht. .SH RÜCKGABEWERT Bei Erfolg wird im Elternprozess die PID des Kindprozesses zurückgegeben und in dem Kind 0. Bei Fehlern wird dem Elternprozess \-1 zurückgegeben, kein Kindprozess erzeugt und \fIerrno\fP entsprechend gesetzt. .SH FEHLER .TP \fBEAGAIN\fP .\" NOTE! The following should match the description in pthread_create(3) Eine systembedingte Begrenzung der Anzahl der Threads wurde erreicht. Es gibt eine Reihe von Begrenzungen, die diesen Fehler auslösen können: .RS .IP * 3 die weiche Ressourcenbegrenzung \fBRLIMIT_NPROC\fP (mittels \fBsetrlimit\fP(2) gesetzt), die die Anzahl der Prozesse und Threads für eine reale Benutzerkennung begrenzt, wurde erreicht; .IP * die systemweite Kernelbegrenzung der Anzahl an Prozessen und Threads, \fI/proc/sys/kernel/threads\-max\fP, wurde erreicht (siehe \fBproc\fP(5)); .IP * die maximale Anzahl an PIDs, \fI/proc/sys/kernel/pid_max\fP, wurde erreicht (siehe \fBproc\fP(5)); .IP * die durch den Cgroup\-Controller »process number« erzwungende PID\-Begrenzung (\fIpids.max\fP) wurde erreicht. .RE .TP \fBEAGAIN\fP Die aufrufende Instanz agiert gemäß der \fBSCHED_DEADLINE\fP\-Scheduling\-Regeln und hat den Schalter reset\-on\-fork nicht gesetzt. Siehe \fBsched\fP(7). .TP \fBENOMEM\fP \fBfork\fP() konnte wegen Speicherknappheit die erforderlichen Kernel\-Strukturen nicht anlegen. .TP \fBENOMEM\fP Es wurde versucht, einen Kindprozess in einem PID\-Namensraum, dessen »init«\-Prozess sich beendet hat, zu erstellen. Siehe \fBpid_namespaces\fP(7). .TP \fBENOSYS\fP .\" e.g., arm (optionally), blackfin, c6x, frv, h8300, microblaze, xtensa \fBfork\fP() wird auf dieser Plattform nicht unterstützt (beispielsweise Hardware ohne eine Speicher\-Management\-Einheit). .TP \fBERESTARTNOINTR\fP (seit Linux 2.6.17) .\" commit 4a2c7a7837da1b91468e50426066d988050e4d56 Ein Systemaufruf wurde durch ein Signal unterbrochen und wird neu gestartet. (Dies wird nur während einer Verfolgung sichtbar sein.) .SH "KONFORM ZU" POSIX.1\-2001, POSIX.1\-2008, SVr4, 4.3BSD. .SH ANMERKUNGEN Unter Linux ist \fBfork\fP() mittels »copy\-on\-write«\-Seiten implementiert, sodass der einzige Nachteil von \fBfork\fP() die Zeit und der Speicher ist, der benötigt wird, um die Page Tables des Elternprozesses zu kopieren und eine eindeutige Task\-Struktur für das Kind anzulegen. .SS "Unterschiede C\-Bibliothek/Kernel" .\" nptl/sysdeps/unix/sysv/linux/fork.c .\" and does some magic to ensure that getpid(2) returns the right value. Der Glibc\-Wrapper für \fBfork\fP() wird als Teil der NPTL\-Threading\-Implementierung bereitgestellt. Seit Version 2.3.3 der Glibc ruft der \fBfork\fP()\-Wrapper nicht mehr den Kernel\-Systemaufruf \fBfork\fP() auf, sondern \fBclone\fP(2) mit Schaltern, die das Gleiche bewirken wie der traditionelle Systemaufruf. (Ein Aufruf von \fBfork\fP() ist gleichbedeutend mit einem Aufruf von \fBclone\fP(2), bei dem für \fIflags\fP nur \fBSIGCHLD\fP angegeben wird.) Der Glibc\-Wrapper ruft alle Fork\-Handler auf, die mittels \fBpthread_atfork\fP(3) eingerichtet wurden. .SH BEISPIELE Siehe \fBpipe\fP(2) und \fBwait\fP(2). .SH "SIEHE AUCH" \fBclone\fP(2), \fBexecve\fP(2), \fBexit\fP(2), \fBsetrlimit\fP(2), \fBunshare\fP(2), \fBvfork\fP(2), \fBwait\fP(2), \fBdaemon\fP(3), \fBpthread_atfork\fP(3), \fBcapabilities\fP(7), \fBcredentials\fP(7) .SH KOLOPHON Diese Seite ist Teil der Veröffentlichung 5.10 des Projekts Linux\-\fIman\-pages\fP. 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/. .PP .SH ÜBERSETZUNG Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Schulze , Martin Eberhard Schauer , Holger Wansing , Mario Blättermann und Helge Kreutzmann erstellt. .PP Diese Übersetzung ist Freie Dokumentation; lesen Sie die .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 .UE oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. .PP Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die .MT debian-l10n-german@lists.debian.org Mailingliste der Übersetzer .ME .