FORK(2) Manuel du programmeur Linux FORK(2)
NOM
fork, vfork - Créer un processus fils (child).
SYNOPSIS
#include <unistd.h>
pid_t fork(void);
pid_t vfork(void);
DESCRIPTION
fork crée un processus fils qui diffère du processus par
ent uniquement par ses valeurs PID et PPID. Les verrouil
lages de fichiers, et les signaux en attente ne sont pas
hérités.
Sous Linux, fork est implementé 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.
vfork est une primitive BSD différente de fork dans laque
lle le fils partage physiquement l'espace d'adressage du
père, ce dernier restant bloqué jusqu'à la terminaison du
fils pour éviter les conflits d'adressage. Le fils doit
dans ce cas se terminer obligatoirement par _exit(2) et
non pas par exit(3).
Pour utiliser vfork il faut avoir défini la constante sym
bolique __USE_BSD
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 Impossible d'allouer assez de mémoire pour copier
la table des pages du père et d'allouer une struc
ture de tâche pour le fils.
ENOMEM Pas assez de mémoire pour le noyau.
EXEMPLE
fork() :
pid_t pid;
Linux 1.2.9 9 Octobre 1996 1
FORK(2) Manuel du programmeur Linux FORK(2)
pid = fork ();
if (pid > 0) {
/* Processus père */
} else if (pid == 0) {
/* Processus fils */
} else {
/* Traitement d'erreur */
}
vfork() :
pid_t pid;
pid = vfork ();
if (pid > 0) {
/* Processus père */
} else if (pid == 0) {
/* Processus fils */
_exit (0);
} else {
/* Traitement d'erreur */
}
CONFORMITÉ
SVr4, SVID, POSIX, X/OPEN, BSD 4.3
VOIR AUSSI
clone(2), execve(2), wait(2)
TRADUCTION
Christophe Blaess, 1997.
Linux 1.2.9 9 Octobre 1996 2