fork

FORK(2)                   Manuel du programmeur Linux                  FORK(2)



NOM
       fork - Créer un processus fils

SYNOPSIS
       #include <unistd.h>

       pid_t fork(void);

DESCRIPTION
       fork() crée un nouveau processus en copiant le processus appelant. Le
       nouveau processus, appelé fils (« child »), est une copie exacte du
       processus appelant, appelé père ou parent, aux exceptions suivantes
       près.

       *  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 processeur (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 verrouillages dâenregistrements associés
          au processus de son père (fcntl(2)) (en revanche, il hérite des
          verrouillages de description de fichier ouvert fcntl(2) et des
          verrouillages flock(2) de son père).

       *  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 de processus de la liste précédente sont tous définis
       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.

       *  La valeur de temporisation relâchée par défaut est définie à la
          valeur de temporisation relâchée actuelle de son père. Veuillez
          consulter la description de PR_SET_TIMERSLACK dans prctl(2).

       *  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 (consultez
          clone(2)).

       *  Les bits de permission d'accès au port indiqués par ioperm(2) ne
          sont pas hérités par le fils ; le fils doit activer avec ioperm(2)
          les bits dont il a besoin.

       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 (consultez 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 (consultez 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 (consultez 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

              Une limite système sur le nombre de processus légers à été
              atteinte. Plusieurs limites pourraient déclencher cette
              erreur : la limite de ressources souple RLIMIT_NPROC (définie
              Ã  lâaide setrlimit(2)), qui limite le nombre de processus et
              processus légers par identifiant dâutilisateur réel, a été
              atteinte ; la limite système imposée par le noyau sur le
              nombre total de processus et processus légers,
              /proc/sys/kernel/threads-max, a été atteinte (consultez
              proc(5)) ; ou le nombre maximal de PID,
              /proc/sys/kernel/pid_max, a été atteint (consultez proc(5)).

       EAGAIN Lâappelant opère sous la politique dâordonnancement
              SCHED_DEADLINE et nâa pas lâattribut reset-on-fork activé.
              Consultez sched(7).

       ENOMEM fork() a échoué car le noyau n'a plus assez de mémoire.

       ENOSYS fork()  n'est pas supporté sur cette plate-forme (par exemple
              sur du matériel sans unité de gestion 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 (un appel à  fork() est équivalent à  un appel Ã
       clone(2) avec flags valant exactement SIGCHLD). L'enveloppe de la glibc
       invoque tous les gestionnaires de bifurcation (« fork ») établis
       avec pthread_atfork(3).

EXEMPLE
       Consultez pipe(2) et wait(2).

VOIR AUSSI
       clone(2), execve(2), exit(2), setrlimit(2), unshare(2), vfork(2),
       wait(2), daemon(3), capabilities(7), credentials(7)

COLOPHON
       Cette page fait partie de la publication 3.70 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
       Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
       <http://po4a.alioth.debian.org/> par l'équipe de traduction
       francophone au sein du projet perkamon
       <http://perkamon.alioth.debian.org/>.

       Christophe Blaess <http://www.blaess.fr/christophe/> (1996-2003), Alain
       Portal <http://manpagesfr.free.fr/> (2003-2006).  Julien Cristau et
       l'équipe francophone de traduction de Debian (2006-2009).

       Veuillez signaler toute erreur de traduction en écrivant Ã
       <perkamon-fr@traduc.org>.

       Vous pouvez toujours avoir accès à la version anglaise de ce document
       en utilisant la commande « LC_ALL=C man <section> <page_de_man> ».



Linux                             28 mai 2014                          FORK(2)