.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2006 Michael Kerrisk .\" A few fragments remain from an earlier (1992) page by .\" Drew Eckhardt (drew@cs.colorado.edu), .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" 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 "3. Mai 2023" "Linux man\-pages 6.05.01" .SH BEZEICHNUNG fork \- erzeugt einen Kindprozess .SH BIBLIOTHEK Standard\-C\-Bibliothek (\fIlibc\fP, \fI\-lc\fP) .SH ÜBERSICHT .nf \fB#include \fP .PP \fBpid_t fork(void);\fP .fi .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 \[bu] 3 Das Kind hat seine eigene eindeutige Prozesskennung, die mit keiner Kennung irgendeiner existierenden Prozessgruppe oder Sitzung übereinstimmt (\fBsetpgid\fP(2)). .IP \[bu] Die Elternprozesskennung des Kindes ist die gleiche wie die Prozesskennung des Elternprozesses. .IP \[bu] Das Kind erbt keine Speichersperren (\fBmlock\fP(2), \fBmlockall\fP(2)) des Elternprozesses. .IP \[bu] 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 \[bu] Die Menge der für das Kind anstehenden Signale ist anfangs leer (\fBsigpending\fP(2)). .IP \[bu] Das Kind erbt keine Semaphore\-Einstellungen von seinem Elternprozess (\fBsemop\fP(2)). .IP \[bu] 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 \[bu] Das Kind erbt keine Timer von seinem Elternprozess (\fBsetitimer\fP(2), \fBalarm\fP(2), \fBtimer_create\fP(2)). .IP \[bu] 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 \[bu] 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 \[bu] 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 \[bu] 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 \[bu] 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 \[bu] 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 \[bu] Das Terminierungssignal des Kindes ist immer \fBSIGCHLD\fP (siehe \fBclone\fP(2)). .IP \[bu] 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 \[bu] 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 \[bu] 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 \[bu] 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 \[bu] 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 \[bu] 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 gesetzt, um den Fehler anzuzeigen. .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 \[bu] 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 \[bu] die systemweite Kernelbegrenzung der Anzahl an Prozessen und Threads, \fI/proc/sys/kernel/threads\-max\fP, wurde erreicht (siehe \fBproc\fP(5)); .IP \[bu] die maximale Anzahl an PIDs, \fI/proc/sys/kernel/pid_max\fP, wurde erreicht (siehe \fBproc\fP(5)); .IP \[bu] 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 VERSIONEN .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 STANDARDS POSIX.1\-2008. .SH GESCHICHTE POSIX.1\-2001, 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. .SH BEISPIELE Siehe \fBpipe\fP(2) und \fBwait\fP(2) für weitere Beispiele. .PP .\" SRC BEGIN (fork.c) .EX #include #include #include #include #include \& int main(void) { pid_t pid; \& if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) { perror("signal"); exit(EXIT_FAILURE); } pid = fork(); switch (pid) { case \-1: perror("fork"); exit(EXIT_FAILURE); case 0: puts("Child exiting."); exit(EXIT_SUCCESS); default: printf("Child is PID %jd\en", (intmax_t) pid); puts("Parent exiting."); exit(EXIT_SUCCESS); } } .EE .\" SRC END .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) .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 .