Man page - fork(2)

Packages contains this manual

Available languages:

en fr it pl nl ja ru de

Manual

fork

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
VERSIONS
Différences entre bibliothÚque C et noyau
STANDARDS
HISTORIQUE
NOTES
EXEMPLES
VOIR AUSSI
TRADUCTION

NOM

fork - Créer un processus enfant

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <unistd.h>

pid_t fork(void);

DESCRIPTION

fork () crée un nouveau processus en copiant le processus appelant. Le nouveau processus est appelé enfant (« child »). Le processus appelant est appelé parent .

Les processus parent et enfant fonctionnent dans des espaces mĂ©moire sĂ©parĂ©s. Au moment du fork (), les deux espaces mĂ©moire ont le mĂȘme contenu. Les Ă©critures en mĂ©moire, les associations de fichier ( mmap (2)) et les dĂ©sassociations ( munmap (2)) effectuĂ©es par un processus ne concernent pas l’autre.

Le processus enfant est une copie exacte du processus parent, sauf sur les points suivants :

-

L’enfant a son propre identifiant de processus unique et ce PID ne correspond à l’identifiant d’aucune session ou d’aucun groupe de processus existant ( setpgid (2)).

-

L’identifiant de processus parent (PPID) de l’enfant est l’identifiant de processus (PID) du parent.

-

L’enfant n’hĂ©rite pas des verrouillages mĂ©moire du parent ( mlock (2), mlockall (2)).

-

Les utilisations de ressources ( getrusage (2)) et les compteurs de temps processeur ( times (2)) sont remis Ă  zĂ©ro dans l’enfant.

-

L’ensemble de signaux en attente dans l’enfant est initialement vide ( sigpending (2)).

-

L’enfant n’hĂ©rite pas des opĂ©rations sur les sĂ©maphores de son parent ( semop (2)).

-

L’enfant n’hĂ©rite pas des verrouillages d’enregistrements associĂ©s au processus de son parent ( fcntl (2)) (en revanche, il hĂ©rite des verrouillages de description de fichier ouvert fcntl (2) et des verrouillages flock (2) de son parent).

-

L’enfant n’hĂ©rite pas des temporisations de son parent ( setitimer (2), alarm (2), timer_create (2)).

-

L’enfant n’hĂ©rite pas des opĂ©rations d’E/S asynchrones en cours de son parent ( aio_read (3), aio_write (3)) et n’hĂ©rite d’aucun contexte d’E/S asynchrone de son parent (consultez io_setup (2)).

Les attributs de processus de la liste précédente sont tous définis dans POSIX.1. Les processus parent et enfant diffÚrent également par les propriétés spécifiques Linux suivantes :

-

L’enfant n’hĂ©rite pas des notifications de modification de rĂ©pertoire (dnotify) de son parent (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 l’enfant ne reçoive pas de signal lorsque son parent 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 parent. 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Ă©es lors d’un fork ().

-

La mĂ©moire dans les plages d’adresses ayant Ă©tĂ© marquĂ©es par un attribut MADV_WIPEONFORK de madvise (2) est remise Ă  zĂ©ro dans l’enfant aprĂšs un fork () (le paramĂštre MADV_WIPEONFORK reste en place pour ces plages d’adresses dans l’enfant).

-

Le signal de terminaison de l’enfant 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 l’enfant ; l’enfant doit activer avec ioperm (2) les bits dont il a besoin.

Notez également les points suivants :

-

Le processus enfant est créé avec un unique thread — celui qui a appelĂ© fork (). L’espace d’adressage virtuel complet du parent est copiĂ© dans l’enfant, y compris l’état des mutex, les 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.

-

AprĂšs un fork () dans un programme multithreadĂ©, l’enfant ne peut appeler en toute sĂ©curitĂ© que les fonctions async-signal-safe (voir signal-safety (7)) jusqu’au moment oĂč il appelle execve (2).

-

L’enfant hĂ©rite de copies des descripteurs de fichier ouverts du parent. Chaque descripteur de fichier de l’enfant 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)).

-

L’enfant hĂ©rite de copies des descripteurs de l’ensemble des files de messages ouvertes du parent (consultez mq_overview (7)). Chaque descripteur de fichier de l’enfant renvoie Ă  la mĂȘme description de file de messages ouverte que le descripteur correspondant dans le parent. Cela signifie que les deux descripteurs partagent leurs attributs ( mq_flags ).

-

L’enfant hĂ©rite d’une copie de l’ensemble des flux de rĂ©pertoire ouverts par le parent (consultez opendir (3)). POSIX.1 indique que les flux de rĂ©pertoire correspondant dans le parent et 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 de l’enfant est renvoyĂ© au parent, et 0 est renvoyĂ© Ă  l’enfant. En cas d’échec -1 est renvoyĂ© au parent, aucun processus enfant n’est créé, et errno est positionnĂ© pour indiquer l’erreur.

ERREURS

EAGAIN

Une limite imposée par le systÚme du nombre de threads a été atteinte. Il existe un certain nombre de limites qui peuvent occasionner cette erreur :

-

La limite de ressource souple RLIMIT_NPROC (dĂ©finie avec setrlimit (2)), qui limite le nombre de processus et de threads pour l’ID d’un utilisateur rĂ©el, a Ă©tĂ© atteinte ;

-

La limite du systÚme du noyau du nombre de processus et de threads, /"proc/sys/kernel/threads-max , a été atteinte (voir proc (5)) ;

-

Le numéro maximal de PID, /proc/sys/kernel/pid_max , a été atteint (voir proc (5)) ;

-

Le nombre maximal de PID ( pids.max ) imposée par le contrÎleur de « nombre de processus » cgroup (PID) a été atteinte.

EAGAIN

L’appelant parent 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

Il y a eu une tentative de crĂ©er un processus enfant dans l’espace de noms d’un PID dont le processus « init » s’est terminĂ©. Voir pid_namespaces (7).

ENOSYS

fork () n’est pas gĂ©rĂ© sur cette plate-forme (par exemple sur du matĂ©riel sans unitĂ© de gestion mĂ©moire).

ERESTARTNOINTR (depuis Linux 2.6.17)

L’appel systĂšme a Ă©tĂ© interrompu par un signal et va ĂȘtre redĂ©marrĂ© (cela n’est visible qu’à l’occasion d’un trace ()).

VERSIONS

Différences entre bibliothÚque C et noyau

Depuis la glibc 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 fourche (« fork ») Ă©tablis avec pthread_atfork (3).

STANDARDS

POSIX.1-2008.

HISTORIQUE

POSIX.1-2001, SVr4, 4.3BSD.

NOTES

Sous Linux, fork () est implĂ©mentĂ© en utilisant une mĂ©thode de copie Ă  l’écriture. Cela 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 unique de tĂąche pour l’enfant.

EXEMPLES

Consultez pipe (2) et wait (2) pour plus d’exemples.

#include <signal.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int
main(void)
{
pid_t pid;
if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) {
perror("signal");
exit(EXIT_FAILURE);
}
pid = fork();
switch (pid) {
case -1:
perror("fork");
exit(EXIT_FAILURE);
case 0:
puts("Child exiting.");
exit(EXIT_SUCCESS);
default:
printf("L’enfant est le PID %jd\n", (intmax_t) pid);
puts("Parent exiting.");
exit(EXIT_SUCCESS);
}
}

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)

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>, David Prévot <david@tilapin.org> et Jean-Philippe MENGUAL <jpmengual@debian.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 .