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