Scroll to navigation

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

NOM

fork - Créer un processus fils

SYNOPSIS

#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);

DESCRIPTION

fork() creates a new process by duplicating the calling process. The new process is referred to as the child process. The calling process is referred to as the parent process.

The child process and the parent process run in separate memory spaces. At the time of fork() both memory spaces have the same content. Memory writes, file mappings (mmap(2)), and unmappings (munmap(2)) performed by one of the processes do not affect the other.

The child process is an exact duplicate of the parent process except for the following points:

  • The child has its own unique process ID, and this PID does not match the ID of any existing process group (setpgid(2)) or session.
  • 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)).

The process attributes in the preceding list are all specified in POSIX.1. The parent and child also differ with respect to the following Linux-specific process attributes:

  • 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().
  • Memory in address ranges that have been marked with the madvise(2) MADV_WIPEONFORK flag is zeroed in the child after a fork(). (The MADV_WIPEONFORK setting remains in place for those address ranges in the child.)
  • 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.
  • After a fork() in a multithreaded program, the child can safely call only async-signal-safe functions (see signal-safety(7)) until such time as it calls execve(2).
  • The child inherits copies of the parent's set of open file descriptors. Each file descriptor in the child refers to the same open file description (see open(2)) as the corresponding file descriptor in the parent. This means that the two file descriptors share open file status flags, file offset, and signal-driven I/O attributes (see the description of F_SETOWN and F_SETSIG in fcntl(2)).
  • The child inherits copies of the parent's set of open message queue descriptors (see mq_overview(7)). Each file descriptor in the child refers to the same open message queue description as the corresponding file descriptor in the parent. This means that the two file descriptors share the same flags (mq_flags).
  • The child inherits copies of the parent's set of open directory streams (see opendir(3)). POSIX.1 says that the corresponding directory streams in the parent and child may share the directory stream positioning; on Linux/glibc they do not.

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
A system-imposed limit on the number of threads was encountered. There are a number of limits that may trigger this error:
  • the RLIMIT_NPROC soft resource limit (set via setrlimit(2)), which limits the number of processes and threads for a real user ID, was reached;
  • the kernel's system-wide limit on the number of processes and threads, /proc/sys/kernel/threads-max, was reached (see proc(5));
  • the maximum number of PIDs, /proc/sys/kernel/pid_max, was reached (see proc(5)); or
  • the PID limit (pids.max) imposed by the cgroup "process number" (PIDs) controller was reached.
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.
ENOMEM
An attempt was made to create a child process in a PID namespace whose "init" process has terminated. See pid_namespaces(7).
ENOSYS
fork() n'est pas supporté sur cette plate-forme (par exemple sur du matériel sans unité de gestion mémoire).
ERESTARTNOINTR (depuis Linux 2.6.17)
System call was interrupted by a signal and will be restarted. (This can be seen only during a trace.)

CONFORMITÉ

POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

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.

différences entre bibliothèque C et noyau

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

EXEMPLES

Consultez pipe(2) et wait(2).

VOIR AUSSI

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

COLOPHON

Cette page fait partie de la publication 5.07 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page, peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org> et David Prévot <david@tilapin.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à <debian-l10n-french@lists.debian.org>.

9 juin 2020 Linux