fork(2) System Calls Manual fork(2) NOM fork - Creer un processus enfant BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include pid_t fork(void); DESCRIPTION fork() cree un nouveau processus en copiant le processus appelant. Le nouveau processus est appele enfant (<< child >>). Le processus appelant est appele parent. Les processus parent et enfant fonctionnent dans des espaces memoire separes. Au moment du fork(), les deux espaces memoire ont le meme contenu. Les ecritures en memoire, les associations de fichier (mmap(2)) et les desassociations (munmap(2)) effectuees 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 a 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'herite pas des verrouillages memoire du parent (mlock(2), mlockall(2)). - Les utilisations de ressources (getrusage(2)) et les compteurs de temps processeur (times(2)) sont remis a zero dans l'enfant. - L'ensemble de signaux en attente dans l'enfant est initialement vide (sigpending(2)). - L'enfant n'herite pas des operations sur les semaphores de son parent (semop(2)). - L'enfant n'herite pas des verrouillages d'enregistrements associes au processus de son parent (fcntl(2)) (en revanche, il herite des verrouillages de description de fichier ouvert fcntl(2) et des verrouillages flock(2) de son parent). - L'enfant n'herite pas des temporisations de son parent (setitimer(2), alarm(2), timer_create(2)). - L'enfant n'herite pas des operations d'E/S asynchrones en cours de son parent (aio_read(3), aio_write(3)) et n'herite d'aucun contexte d'E/S asynchrone de son parent (consultez io_setup(2)). Les attributs de processus de la liste precedente sont tous definis dans POSIX.1. Les processus parent et enfant different egalement par les proprietes specifiques Linux suivantes : - L'enfant n'herite pas des notifications de modification de repertoire (dnotify) de son parent (voir la description de F_NOTIFY dans fcntl(2)). - Le drapeau PR_SET_PDEATHSIG de prctl(2) est reinitialise, de maniere a ce que l'enfant ne recoive pas de signal lorsque son parent se termine. - La valeur de temporisation relachee par defaut est definie a la valeur de temporisation relachee actuelle de son parent. Veuillez consulter la description de PR_SET_TIMERSLACK dans prctl(2). - Les projections en memoire qui ont ete marquees avec l'attribut MADV_DONTFORK de madvise(2) ne sont pas heritees lors d'un fork(). - La memoire dans les plages d'adresses ayant ete marquees par un attribut MADV_WIPEONFORK de madvise(2) est remise a zero dans l'enfant apres un fork() (le parametre 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'acces au port indiques par ioperm(2) ne sont pas herites par l'enfant ; l'enfant doit activer avec ioperm(2) les bits dont il a besoin. Notez egalement les points suivants : - Le processus enfant est cree avec un unique thread -- celui qui a appele fork(). L'espace d'adressage virtuel complet du parent est copie dans l'enfant, y compris l'etat des mutex, les variables de condition, et autres objets de pthreads ; l'utilisation de pthread_atfork(3) peut etre utile pour traiter les problemes que cela peut occasionner. - Apres un fork() dans un programme multithreade, l'enfant ne peut appeler en toute securite que les fonctions async-signal-safe (voir signal-safety(7)) jusqu'au moment ou il appelle execve(2). - L'enfant herite de copies des descripteurs de fichier ouverts du parent. Chaque descripteur de fichier de l'enfant renvoie a la meme 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'etat du fichier, le decalage et les attributs d'E/S lies aux signaux (voir la description de F_SETOWN et F_SETSIG dans fcntl(2)). - L'enfant herite 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 a la meme 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 herite d'une copie de l'ensemble des flux de repertoire ouverts par le parent (consultez opendir(3)). POSIX.1 indique que les flux de repertoire correspondant dans le parent et l'enfant peuvent partager le positionnement du flux de repertoire ; sous Linux/glibc, ce n'est pas le cas. VALEUR RENVOYEE En cas de succes, le PID de l'enfant est renvoye au parent, et 0 est renvoye a l'enfant. En cas d'echec -1 est renvoye au parent, aucun processus enfant n'est cree, et errno est positionne pour indiquer l'erreur. ERREURS EAGAIN Une limite imposee par le systeme du nombre de threads a ete atteinte. Il existe un certain nombre de limites qui peuvent occasionner cette erreur : - La limite de ressource souple RLIMIT_NPROC (definie avec setrlimit(2)), qui limite le nombre de processus et de threads pour l'ID d'un utilisateur reel, a ete atteinte ; - La limite du systeme du noyau du nombre de processus et de threads, /"proc/sys/kernel/threads-max, a ete atteinte (voir proc(5)) ; - Le numero maximal de PID, /proc/sys/kernel/pid_max, a ete atteint (voir proc(5)) ; - Le nombre maximal de PID (pids.max) imposee par le controleur de << nombre de processus >> cgroup (PID) a ete atteinte. EAGAIN L'appelant parent opere sous la politique d'ordonnancement SCHED_DEADLINE et n'a pas l'attribut reset-on-fork active. Consultez sched(7). ENOMEM fork() a echoue car le noyau n'a plus assez de memoire. ENOMEM Il y a eu une tentative de creer un processus enfant dans l'espace de noms d'un PID dont le processus << init >> s'est termine. Voir pid_namespaces(7). ENOSYS fork() n'est pas gere sur cette plate-forme (par exemple sur du materiel sans unite de gestion memoire). ERESTARTNOINTR (depuis Linux 2.6.17) L'appel systeme a ete interrompu par un signal et va etre redemarre (cela n'est visible qu'a l'occasion d'un trace()). VERSIONS Differences entre bibliotheque C et noyau Depuis la glibc 2.3.3, plutot que d'invoquer l'appel systeme fork() du noyau, l'enveloppe fork() de la glibc qui est fournie comme faisant partie de l'implementation de threading NPTL invoque clone(2) avec des attributs qui fournissent le meme effet que l'appel systeme traditionnel (un appel a fork() est equivalent a un appel a clone(2) avec flags valant exactement SIGCHLD). L'enveloppe de la glibc invoque tous les gestionnaires de fourche (<< fork >>) etablis avec pthread_atfork(3). STANDARDS POSIX.1-2008. HISTORIQUE POSIX.1-2001, SVr4, 4.3BSD. NOTES Sous Linux, fork() est implemente en utilisant une methode de copie a l'ecriture. Cela consiste a ne faire la veritable duplication d'une page memoire que lorsqu'un processus en modifie une instance. Tant qu'aucun des deux processus n'ecrit dans une page donnee, celle-ci n'est pas vraiment dupliquee. Ainsi les seules penalisations induites par fork() sont le temps et la memoire necessaires a la copie de la table des pages du parent ainsi que la creation d'une structure unique de tache pour l'enfant. EXEMPLES Consultez pipe(2) et wait(2) pour plus d'exemples. #include #include #include #include #include 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 francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 fork(2)