Index général des pages de man   Index Section man 2   Table des Matières de clone   Imprime la page de man clone en mode Texte   Recherche dans les pages de man   Page de man en français      Fonctions du système (section 2)

clone

 
  

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é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.

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 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.

Bogues

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. 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) .

Voir Aussi

fork(2)

Traduction

Christophe Blaess, 1997.


Table des matières


Haut de page

© 1996-2000 Adaptation française "Christophe Blaess"