FORK(2)

NOM
fork, vfork - Creer un processus fils (child).

SYNOPSIS
#include <unistd.h>

pid_t fork(void);
pid_t vfork(void);

DESCRIPTION
fork cree un processus fils qui differe du processus parent uniquement par ses valeurs PID et PPID. Les verrouillages de fichiers, et les signaux en attente ne sont pas herites.

Sous Linux, fork est implemente en utilisant une methode de copie a l'ecriture. Ceci 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 la table des pages du parent ainsi que la creation d'une structure de taches pour le fils.

vfork est une primitive BSD differente de fork dans laquelle le fils partage physiquement l'espace d'adressage du pere, ce dernier restant bloque jusqu'a la terminaison du fils pour eviter 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 defini la constante symbolique __USE_BSD

VALEUR RENVOYEE
En cas de succes, le PID du fils est renvoye au processus parent, et 0 est renvoye au processus fils. En cas d'echec -1 est renvoye dans le contexte du parent, aucun processus fils n'est cree, et errno contient le code d'erreur.

ERREURS

EAGAIN
    Impossible d'allouer assez de memoire pour copier la table des pages du pere et d'allouer une structure de tache pour le fils.

ENOMEM
    Pas assez de memoire pour le noyau.

EXEMPLE
fork() :
    pid_t   pid;
    pid = fork ();
    if (pid > 0) {
         /* Processus pere      */
    } else if (pid == 0) {
         /* Processus fils      */
    } else {
         /* Traitement d'erreur */
    }

vfork() :
    pid_t   pid;
    pid = vfork ();
    if (pid > 0) {
         /* Processus pere      */
    } else if (pid == 0) {
         /* Processus fils      */
         _exit (0);
    } else {
         /* Traitement d'erreur */
    }

CONFORMITE
SVr4, SVID, POSIX, X/OPEN, BSD 4.3

VOIR AUSSI
clone(2), execve(2), wait(2)