Loading

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> ».