.\" -*- 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 "5 février 2023" "Pages du manuel de Linux 6.03" .SH NOM fork \- Créer un processus enfant .SH BIBLIOTHÈQUE Bibliothèque C standard (\fIlibc\fP, \fI\-lc\fP) .SH SYNOPSIS .nf \fB#include \fP .PP \fBpid_t fork(void);\fP .fi .SH DESCRIPTION \fBfork\fP() crée un nouveau processus en copiant le processus appelant. Le nouveau processus est appelé \fIenfant\fP («\ child\ »). Le processus appelant est appelé \fIparent\fP. .PP Les processus parent et enfant fonctionnent dans des espaces mémoire séparés. Au moment du \fBfork\fP(), les deux espaces mémoire ont le même contenu. Les écritures en mémoire, les associations de fichier (\fBmmap\fP(2)) et les désassociations (\fBmunmap\fP(2)) effectuées par un processus ne concernent pas l'autre. .PP Le processus enfant est une copie exacte du processus parent, sauf sur les points suivants\ : .IP \[bu] 3 L'enfant a son propre identifiant de processus unique et ce PID ne correspond à l'identifiant d'aucune session ou d'aucun groupe de processus existant (\fBsetpgid\fP(2)). .IP \[bu] L'identifiant de processus parent (PPID) de l'enfant est l'identifiant de processus (PID) du parent. .IP \[bu] L'enfant n'hérite pas des verrouillages mémoire du parent (\fBmlock\fP(2), \fBmlockall\fP(2)). .IP \[bu] Les utilisations de ressources (\fBgetrusage\fP(2)) et les compteurs de temps processeur (\fBtimes\fP(2)) sont remis à zéro dans l'enfant. .IP \[bu] L'ensemble de signaux en attente dans l'enfant est initialement vide (\fBsigpending\fP(2)). .IP \[bu] L'enfant n'hérite pas des opérations sur les sémaphores de son parent (\fBsemop\fP(2)). .IP \[bu] L'enfant n'hérite pas des verrouillages d’enregistrements associés au processus de son parent (\fBfcntl\fP(2)) (en revanche, il hérite des verrouillages de description de fichier ouvert \fBfcntl\fP(2) et des verrouillages \fBflock\fP(2) de son parent). .IP \[bu] L'enfant n'hérite pas des temporisations de son parent (\fBsetitimer\fP(2), \fBalarm\fP(2), \fBtimer_create\fP(2)). .IP \[bu] L'enfant n'hérite pas des opérations d'E/S asynchrones en cours de son parent (\fBaio_read\fP(3), \fBaio_write\fP(3)) et n'hérite d'aucun contexte d'E/S asynchrone de son parent (consultez \fBio_setup\fP(2)). .PP Les attributs de processus de la liste précédente sont tous définis dans POSIX.1. Les processus parent et enfant diffèrent également par les propriétés spécifiques Linux suivantes\ : .IP \[bu] 3 L'enfant n'hérite pas des notifications de modification de répertoire (dnotify) de son parent (voir la description de \fBF_NOTIFY\fP dans \fBfcntl\fP(2)). .IP \[bu] Le drapeau \fBPR_SET_PDEATHSIG\fP de \fBprctl\fP(2) est réinitialisé, de manière à ce que l'enfant ne reçoive pas de signal lorsque son parent se termine. .IP \[bu] La valeur de temporisation relâchée par défaut est définie à la valeur de temporisation relâchée actuelle de son parent. Veuillez consulter la description de \fBPR_SET_TIMERSLACK\fP dans \fBprctl\fP(2). .IP \[bu] Les projections en mémoire qui ont été marquées avec l'attribut \fBMADV_DONTFORK\fP de \fBmadvise\fP(2) ne sont pas héritées lors d'un \fBfork\fP(). .IP \[bu] La mémoire dans les plages d'adresses ayant été marquées par un attribut \fBMADV_WIPEONFORK\fP de \fBmadvise\fP(2) est remise à zéro dans l'enfant après un \fBfork\fP() (le paramètre \fBMADV_WIPEONFORK\fP reste en place pour ces plages d'adresses dans l'enfant). .IP \[bu] Le signal de terminaison de l'enfant est toujours \fBSIGCHLD\fP (consultez \fBclone\fP(2)). .IP \[bu] Les bits de permission d'accès au port indiqués par \fBioperm\fP(2) ne sont pas hérités par l'enfant\ ; l'enfant doit activer avec \fBioperm\fP(2) les bits dont il a besoin. .PP Notez également les points suivants\ : .IP \[bu] 3 Le processus enfant est créé avec un unique thread \[em] celui qui a appelé \fBfork\fP(). L'espace d'adressage virtuel complet du parent est copié dans l'enfant, y compris l'état des mutex, les variables de condition, et autres objets de pthreads\ ; l'utilisation de \fBpthread_atfork\fP(3) peut être utile pour traiter les problèmes que cela peut occasionner. .IP \[bu] Après un \fBfork\fP() dans un programme multithreadé, l'enfant ne peut appeler en toute sécurité que les fonctions async\-signal\-safe (voir \fBsignal\-safety\fP(7)) jusqu'au moment où il appelle \fBexecve\fP(2). .IP \[bu] L'enfant hérite de copies des descripteurs de fichier ouverts du parent. Chaque descripteur de fichier de l'enfant renvoie à la même description de fichier ouvert (consultez \fBopen\fP(2)) que le descripteur de fichier correspondant dans le processus parent. Cela signifie que les deux descripteurs partagent les attributs d'état du fichier, le décalage et les attributs d'E/S liés aux signaux (voir la description de \fBF_SETOWN\fP et \fBF_SETSIG\fP dans \fBfcntl\fP(2)). .IP \[bu] L'enfant hérite de copies des descripteurs de l'ensemble des files de messages ouvertes du parent (consultez \fBmq_overview\fP(7)). Chaque descripteur de fichier de l'enfant renvoie à la même description de file de messages ouverte que le descripteur correspondant dans le parent. Cela signifie que les deux descripteurs partagent leurs attributs (\fImq_flags\fP). .IP \[bu] L'enfant hérite d'une copie de l'ensemble des flux de répertoire ouverts par le parent (consultez \fBopendir\fP(3)). POSIX.1 indique que les flux de répertoire correspondant dans le parent et l'enfant \fIpeuvent\fP partager le positionnement du flux de répertoire\ ; sous Linux/glibc, ce n'est pas le cas. .SH "VALEUR RENVOYÉE" En cas de succès, le PID de l'enfant est renvoyé au parent, et \fB0\fP est renvoyé à l'enfant. En cas d'échec \fB\-1\fP est renvoyé au parent, aucun processus enfant n'est créé, et \fIerrno\fP est positionné pour indiquer l'erreur. .SH ERREURS .TP \fBEAGAIN\fP .\" NOTE! The following should match the description in pthread_create(3) Une limite imposée par le système du nombre de threads a été atteinte. Il existe un certain nombre de limites qui peuvent occasionner cette erreur\ : .RS .IP \[bu] 3 La limite de ressource souple \fBRLIMIT_NPROC\fP (définie avec \fBsetrlimit\fP(2)), qui limite le nombre de processus et de threads pour l'ID d'un utilisateur réel, a été atteinte\ ; .IP \[bu] La limite du système du noyau du nombre de processus et de threads, \fI/"proc/sys/kernel/threads\-max\fP, a été atteinte (voir \fBproc\fP(5))\ ; .IP \[bu] Le numéro maximal de PID, \fI/proc/sys/kernel/pid_max\fP, a été atteint (voir \fBproc\fP(5))\ ; .IP \[bu] Le nombre maximal de PID (\fIpids.max\fP) imposée par le contrôleur de «\ nombre de processus\ » cgroup (PID) a été atteinte. .RE .TP \fBEAGAIN\fP L’appelant parent opère sous la politique d’ordonnancement \fBSCHED_DEADLINE\fP et n’a pas l’attribut reset\-on\-fork activé. Consultez \fBsched\fP(7). .TP \fBENOMEM\fP \fBfork\fP() a échoué car le noyau n'a plus assez de mémoire. .TP \fBENOMEM\fP Il y a eu une tentative de créer un processus enfant dans l'espace de noms d'un PID dont le processus «\ init\ » s'est terminé. Voir \fBpid_namespaces\fP(7). .TP \fBENOSYS\fP .\" e.g., arm (optionally), blackfin, c6x, frv, h8300, microblaze, xtensa \fBfork\fP() n'est pas géré sur cette plate\-forme (par exemple sur du matériel sans unité de gestion mémoire). .TP \fBERESTARTNOINTR\fP (depuis Linux 2.6.17) .\" commit 4a2c7a7837da1b91468e50426066d988050e4d56 L'appel système a été interrompu par un signal et va être redémarré (cela n'est visible qu'à l'occasion d'un \fBtrace\fP()). .SH STANDARDS POSIX.1\-2001, POSIX.1\-2008, SVr4, 4.3BSD. .SH NOTES Sous Linux, \fBfork\fP() est implémenté en utilisant une méthode de copie à l'écriture. Cela consiste à ne faire la véritable duplication d'une page mémoire que lorsqu'un processus en modifie une instance. Tant qu'aucun des deux processus n'écrit dans une page donnée, celle\(hyci n'est pas vraiment dupliquée. Ainsi les seules pénalisations induites par \fBfork\fP() sont le temps et la mémoire nécessaires à la copie de la table des pages du parent ainsi que la création d'une structure unique de tâche pour l'enfant. .SS "différences entre bibliothèque C et noyau" .\" nptl/sysdeps/unix/sysv/linux/fork.c .\" and does some magic to ensure that getpid(2) returns the right value. Depuis la glibc\ 2.3.3, plutôt que d'invoquer l'appel système \fBfork\fP() du noyau, l'enveloppe \fBfork\fP() de la glibc qui est fournie comme faisant partie de l'implémentation de threading NPTL invoque \fBclone\fP(2) avec des attributs qui fournissent le même effet que l'appel système traditionnel (un appel à \fBfork\fP() est équivalent à un appel à \fBclone\fP(2) avec \fIflags\fP valant exactement \fBSIGCHLD\fP). L'enveloppe de la glibc invoque tous les gestionnaires de fourche («\ fork\ ») établis avec \fBpthread_atfork\fP(3). .SH EXEMPLES Consultez \fBpipe\fP(2) et \fBwait\fP(2) pour plus d'exemples. .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("L'enfant est le PID %jd\en", (intmax_t) pid); puts("Parent exiting."); exit(EXIT_SUCCESS); } } .EE .\" SRC END .SH "VOIR AUSSI" \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 TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot et Jean-Philippe MENGUAL . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .