NOM
fork - Créer un processus fils
SYNOPSIS
#include <unistd.h>
pid_t fork(void);
fork() crée un nouveau processus en copiant le processus appelant. Le
nouveau processus, qu’on appelle fils (« child »), est une copie exacte
du processus appelant, qu’on appelle pre ou parent, avec les
exceptions suivantes :
* Le fils a son propre identifiant de processus unique, et ce PID ne
correspond à l’identifiant d’aucun groupe de processus existant
(setpgid(2)).
* L’identifiant de processus parent (PPID) du fils est l’identifiant
de processus (PID) du père.
* Le fils n’hérite pas des verrouillages mémoire du père (mlock(2),
mlockall(2)).
* Les utilisations de ressources (getrusage(2)) et les compteurs de
temps CPU (times(2)) sont remis à zéro dans le fils.
* L’ensemble de signaux en attente dans le fils est initialement vide
(sigpending(2)).
* Le fils n’hérite pas des opérations sur les sémaphores de son père
(semop(2)).
* Le fils n’hérite pas des verrous d’enregistrements de son père
(fcntl(2)).
* Le fils n’hérite pas des temporisations de son père (setitimer(2),
alarm(2), timer_create(2)).
* Le fils n’hérite pas des opérations d’E/S asynchrones en cours de
son père (aio_read(3), aio_write(3)) et n’hérite d’aucun contexte
d’E/S asynchrone de son père (consultez io_setup(2)).
Les attributs du processus listés ci‐dessus sont tous spécifiés dans
POSIX.1-2001. Les processus parent et fils diffèrent également par les
propriétés spécifiques Linux suivantes :
* Le fils n’hérite pas des notifications de modification de répertoire
(dnotify) de son père (voir la description de F_NOTIFY dans
fcntl(2)).
* Le drapeau PR_SET_PDEATHSIG de prctl(2) est réinitialisé, de manière
à ce que le fils ne reçoive pas de signal lorsque son père se
termine.
* Les projections en mémoire qui ont été marquées avec l’attribut
MADV_DONTFORK de madvise(2) ne sont pas hérités lors d’un fork().
* Le signal de terminaison du fils est toujours SIGCHLD (voir
clone(2)).
Notez également les points suivants :
* Le processus fils est créé avec un unique thread — celui qui a
appelé fork(). L’espace d’adressage virtuel complet du parent est
copié dans le fils, y compris l’état des mutex, variables de
condition, et autres objets de pthreads ; l’utilisation de
pthread_atfork(3) peut être utile pour traiter les problèmes que
cela peut occasionner.
* Le fils hérite de copies des descripteurs de fichier ouverts du
père. Chaque descripteur de fichier du fils renvoie à la même
description de fichier ouvert (voir open(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 F_SETOWN et F_SETSIG dans fcntl(2)).
* Le fils hérite de copies des descripteurs files de messages ouvertes
dans le père (voir mq_overview(7)). Chaque descripteur dans le fils
renvoie à la même description de file de messages ouverte que le
descripteur correspondant dans le père. Cela signifie que les deux
descripteurs partagent leurs attributs (mq_flags).
* Le fils hérite d’une copie de l’ensemble des flux de répertoire
ouverts par le parent (voir opendir(3)). POSIX.1-2001 indique que
les flux de répertoire correspondant dans le parent ou l’enfant
peuvent partager le positionnement du flux de répertoire ; sous
Linux/glibc, ce n’est pas le cas.
VALEUR RENVOYÉE
En cas de succès, le PID du fils est renvoyé au parent, et 0 est
renvoyé au fils. En cas d’échec -1 est renvoyé au parent, aucun
processus fils n’est créé, et errno contient le code d’erreur.
ERREURS
EAGAIN fork() ne peut pas allouer assez de mémoire pour copier la table
des pages du père et allouer une structure de tâche pour le
fils.
EAGAIN Il n’a pas été possible de créer un nouveau processus car la
limite ressource RLIMIT_NPROC de l’appelant a été rencontrée.
Pour franchir cette limite, le processus doit avoir au moins
l’une des deux capacités CAP_SYS_ADMIN ou CAP_SYS_RESOURCE.
ENOMEM fork() a échoué car le noyau n’a plus assez de mémoire.
CONFORMITÉ
SVr4, BSD 4.3, POSIX.1-2001.
NOTES
Sous Linux, fork() est implémenté en utilisant une méthode de copie à
l’écriture. Ceci 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‐ci
n’est pas vraiment dupliquée. Ainsi les seules pénalisations induites
par fork 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 de tâche pour
le fils.
Depuis la version 2.3.3, plutôt que d’invoquer l’appel système fork()
du noyau, l’enveloppe fork() de la glibc qui est fournie comme faisant
partie de l’implémentation de threading NPTL invoque clone(2) avec des
attributs qui fournissent le même effet que l’appel système
traditionnel. L’enveloppe de la glibc invoque tous les gestionnaires de
bifurcation (Ndt : fork) établis avec pthread_atfork(3).
EXEMPLE
Voir pipe(2) et wait(2).
VOIR AUSSI
clone(2), execve(2), setrlimit(2), unshare(2), vfork(2), wait(2),
daemon(3), capabilities(7), credentials(7)
COLOPHON
Cette page fait partie de la publication 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».