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 dupliquant le processus appelant. Le nouveau processus, que l'on appelle processus fils, est la copie exacte du processus appelant, que l'on appelle processus père ou parent, avec les exceptions suivantes :

*   Le fils a son propre identifiant de processus (PID). Ce PID est unique et ne correspond à aucun autre identifiant de groupe de processus existant (setpgid(2)).

*   Le PPID (Parent Process ID) du fils est identique au PID du parent.

*   Le fils n'hérite pas des verrouillages mémoire de son parent (mlock(2), mlockall(2)).

*   Les statistiques d'utilisation des ressources de processus (getrusage(2)) et les compteurs de temps CPU (times(2)) sont réinitialisés dans le fils.

*   L'ensemble des signaux en attente dans le fils est initialement vide (sigpending(2)).

*   Le fils n'hérite pas des ajustements de sémaphore de son parent (semop(2)).

*   Le fils n'hérite pas des verrous d'enregistrement de son parent (fcntl(2)).

*   Le fils n'hérite pas des temporisations de son parent (setitimer(2), alarm(2), timer_create(3)).

*   Le fils n'hérite pas des opérations d'E/S asynchrones en cours de son parent (aio_read(3), aio_write(3)).

Les attributs de processus de la liste précédente sont tous spécifiés dans POSIX.1-2001. Les processus parent et fils diffèrent également par les attributs de processus suivants, spécifiques à Linux :

*   Le fils n'hérite pas des notifications de changement de répertoire (dnotify) de son parent (voir la description de F_NOTIFY dans fcntl(2)).

*   L'attribut PR_SET_PDEATHSIG de prctl(2) est réinitialisé de sorte que le fils ne reçoive pas de signal lorsque son parent 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 à travers un fork().

*   Le signal de terminaison du fils est toujours SIGCHLD (voir clone(2)).

Veuillez également noter 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. Cela inclut les états des mutexes, les variables de condition et autres objets pthreads ; l'utilisation de pthread_atfork(3) peut être préférable afin de gérer les problèmes qui pourraient être provoqués.

*   Le fils hérite d'une copie de l'ensemble des descripteurs de fichier ouverts du parent. Chaque descripteur de fichier du fils fait référence à 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 de fichier ouvert, la position de la tête de lecture et les attributs d'E/S pilotées par signaux (voir la description de F_SETOWN et F_SETSIG dans fcntl(2)).

*   Le fils hérite d'une copie de l'ensemble des descripteurs de files de messages ouverts (voir mq_overview(7)). Chaque descripteur dans le fils fait référence à la même description de file de messages ouverte que le descripteur de file de message ouvert dans le parent. Cela signifie que les deux descripteurs partagent les même drapeaux (mq_flags).

*   Le fils hérite d'une copie de l'ensemble des descripteurs de flux vers répertoires ouverts (voir opendir(3)). POSIX.1-2001 indique que les flux vers les répertoires correspondants chez le parent et le fils peuvent partager le même positionneur de flux vers répertoire ; ce n'est pas le cas sous Linux/glibc.

VALEUR RENVOYÉE
En cas de succès, le PID du fils est renvoyé au processus parent, et 0 est renvoyé au processus fils. En cas d'échec -1 est renvoyé dans le contexte du 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 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 le traditionnel appel système. 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), capabilities(7), credentials(7)

TRADUCTION

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 9 octobre 1996 et révisée le 24 juin 2008.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 fork ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.