CLONE(2)           Manuel du programmeur Linux           CLONE(2)


NOM
       __clone - Créer un processus fils (child).

SYNOPSIS
       #include <linux/sched.h>

       int  __clone(int  (*fn)  (void *arg), void *pile_fils, int
       flags, void *arg)

DESCRIPTION
       __clone cree un nouveau processus, comme le fait  fork(2).
       Contrairement  à celui-ci, __clone permet le partage d'une
       partie du contexte d'exécution entre le processus père  et
       le   processus  fils.  Le  partage  peut  s'appliquer  sur
       l'espace  mémoire,  sur  la  table  des  descripteurs   de
       fichiers, la table des gestionnaires de signaux...

       L'appel  système  __clone  est principalement utilisé pour
       permettre l'implémentation des threads : un programme  est
       scindé  en  plusieures  lignes  de  contrôle,  s'exécutant
       simultanément dans un espace de mémoire partagée.

       Quand le processus fils est créé, il exécute  la  fonction
       fn(arg).   L'argument  fn  est un pointeur sur la fonction
       appelée par le  processus  fils  lors  de  son  démarrage.
       L'argument  arg  est transmis à la fonction fn lors de son
       invocation.

       Quand la fonction fn(arg) revient, le  processus  fils  se
       termine.  La  valeur  entière renvoyée par fn est utilisée
       comme code de retour du processus fils.  Ce  dernier  peut
       également se terminer de manière explicite en invoquant la
       fonction exit(2) ou après la réception d'un signal  fatal.

       L'argument  pile_fils  indique  l'emplacement  de  la pile
       utilisée par le processus fils.  Comme les processus  père
       et fils peuvent partager de la mémoire, il n'est générale­
       ment pas possible pour le fils d'utiliser la même pile que
       son père. Le processus parent doit donc préparer un espace
       mémoire pour stocker la pile de son fils, et transmettre à
       __clone un pointeur sur cet emplacement.

       Les  piles  croissent vers le bas sur tous les processeurs
       implémentant Linux (sauf le HP PA),  donc  pile_fils  doit
       pointer  sur  la  plus  haute  adresse de l'espace mémoire
       prévu pour la pile du processus fils.

       L'octet de poids faible de flags  contient  le  numéro  du
       signal  qui  sera envoyé au père lorsque le processus fils
       se terminera.  flags permet également de préciser  ce  qui
       sera partagé entre le père et le fils, en effectuant un OU
       binaire entre une ou plusieurs des constantes suivantes :





Linux                   18 Septembre 1998                       1





CLONE(2)           Manuel du programmeur Linux           CLONE(2)


       CLONE_VM
              Si le bit CLONE_VM est actif, les processus père et
              fils  s'exécutent  dans le même espace mémoire.  En
              particulier, les écritures  en  mémoire  effectuées
              par  l'un  des processus sont visibles par l'autre.
              De même toute projection en mémoire, ou toute  sup­
              pression  de projection, effectuées avec mmap(2) ou
              munmap(2) par l'un des processus  affectera  égale­
              ment l'autre processus.

              Si  CLONE_VM  n'est  pas  actif,  le processus fils
              utilisera une copie distincte de  l'espace  mémoire
              de  son  père.  Le  cliché  étant  réalisé  lors de
              l'invocation de __clone.  Les écritures ou les pro­
              jections  de  fichiers en mémoire effectuées par un
              processus n'affectent pas l'autre processus,  comme
              cela se passe avec fork(2).


       CLONE_FS
              Si  l'attribut CLONE_FS est positionné, les proces­
              sus père et fils partagent les  mêmes  informations
              concernant  le  système de fichiers. Ceci inclue la
              racine du système de  fichiers,  le  répertoire  de
              travail,   et  l'umask.  Tout  appel  à  chroot(2),
              chdir(2), ou umask(2)  effectué  par  un  processus
              aura également influence sur l'autre processus.

              Si  CLONE_FS  n'est  pas  choisi, le processus tra­
              vaille sur une copie des informations du père  con­
              cernant  le  système  de  fichiers. Cette copie est
              effectuée lors de  l'invocation  de  __clone.   Les
              appels  à chroot(2),chdir(2),umask(2) effectués par
              un processus n'affectent pas l'autre processus.


       CLONE_FILES
              Si l'attribut CLONE_FILES est positionné, les  pro­
              cessus  père  et  fils  partagent la même table des
              descripteurs de fichiers. Les  descripteurs  feront
              alors  toujours  référence  aux mêmes fichiers pour
              les deux processus. Tout  decripteur  créé  par  un
              processus est également valide pour l'autre proces­
              sus. De même si un processus ferme un  descripteur,
              ou  modifie ses attributs, l'autre processus en est
              aussi affecté.

              Si CLONE_FILES n'est pas positionné,  le  processus
              fils   hérite   d'une  copie  des  descripteurs  de
              fichiers ouverts par son père au moment de  l'appel
              __clone.   Les opérations effectuées ensuite sur un
              descripteur par un des  processus  n'affectent  pas
              l'autre processus.




Linux                   18 Septembre 1998                       2





CLONE(2)           Manuel du programmeur Linux           CLONE(2)


       CLONE_SIGHAND
              Si  l'attribut  CLONE_SIGHAND  est  positionné, les
              processus père et fils partagent la même table  des
              gestionnaires  de  signaux. Si le père, ou le fils,
              appelle sigaction(2) pour modifier le  comportement
              associé  à un signal, ce comportement est également
              changé pour l'autre processus. Néanmoins,  le  père
              et le fils ont toujours des masques de signaux dis­
              tincts, et leurs ensembles de signaux bloqués  sont
              indépendants.  L'un des processus peut donc bloquer
              un signal en utilisant sigprocmask(2) sans affecter
              l'autre processus.

              Si  CLONE_SIGHAND  n'est  pas utilisé, le processus
              fils hérite d'une copie des gestionnaires  de  sig­
              naux  de  son père lors de l'invocation de __clone.
              Les appels à sigaction(2) effectués ensuite  depuis
              un processus n'ont pas d'effets sur l'autre proces­
              sus.


       CLONE_PID
              Si l'attribut CLONE_PID est positionné, les proces­
              sus père et fils ont le même numéro de processus.

              Si  CLONE_PID  n'est  pas sélectionné, le processus
              fils possède un identificateur unique, distinct  de
              celui de son père.


VALEUR RENVOYÉE
       clone  S'il  réussit,  renvoie le PID du processus fils au
       processus père, et 0 au processus fils.   En  cas  d'échec
       clone  renvoie  -1 au processus père, aucun processus fils
       n'est créé, et errno contient le code d'erreur.

ERREURS
       ENOSYS clone déclenchera toujours cette erreur à moins que
              le  noyau  n'ait été compilé avec la constante sym­
              bolique CLONE_ACTUALLY_WORKS_OK définie.

       EAGAIN Pas assez de mémoire  pour  copier  les  tables  de
              pages  du processus parent et allouer une structure
              de tâche pour le processus fils.

BUGS
       Par défaut CLONE_ACTUALLY_WORKS_OK n'est pas défini.
       Il n'y a pas de définition pour clone dans libc.so.4.5.26.
       Les  commentaires  dans le noyau (1.1.46) indiquent que le
       cas où COPYVM n'est pas défini est mal géré.

CONFORMITÉ
       Cet appel-système est spécifique à Linux et  ne  doit  pas
       être employé dans des programmes portables.



Linux                   18 Septembre 1998                       3





CLONE(2)           Manuel du programmeur Linux           CLONE(2)


VOIR AUSSI
       fork(2)


TRADUCTION
       Christophe Blaess, 1997.



















































Linux                   18 Septembre 1998                       4