| | |
__clone - Créer un processus fils (child).
#include
<linux/sched.h>
int __clone(int (*fn) (void *arg), void *pile_fils, int flags,
void *arg)
__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éralement 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
:
- 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 suppression de projection, effectuées avec mmap(2)
ou munmap(2)
par l'un des processus affectera également 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 projections 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 processus 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 travaille sur une copie des informations du père
concernant 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 processus 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 processus. 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.
- 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 distincts, 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 signaux
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 processus.
- CLONE_PID
- Si l'attribut CLONE_PID est positionné, les processus 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.
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.
- ENOSYS
- clone déclenchera toujours cette erreur à moins que le noyau
n'ait été compilé avec la constante symbolique 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.
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é.
Cet appel-système est spécifique à Linux
et ne doit pas être employé dans des programmes portables. Pour programmer
des applications multithreads, il vaut mieux employer une bibliothèque
qui implémente l'API des Threads Posix 1003.1c comme la bibliothèque LinuxThreads
(incluse dans la GlibC 2). Voir pthread_create(3thr)
.
fork(2)
Christophe Blaess, 1997.
Table des matières
© 1996-2000 Adaptation française "Christophe Blaess"
| |