CLONE |
Clonage |
---|---|
sched.h |
Syntaxe
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ... /* pid_t *ptid, void *newtls, pid_t *ctid */ ); | Prototype glibc |
long clone(unsigned long flags, void *child_stack, int *ptid, unsigned long newtls, int *ctid); | Architecture 80x86 en 32 bits |
long clone(unsigned long flags, void *child_stack, int *ptid, int *ctid, unsigned long newtls); | Architecture 80x86 en 64 bits |
long clone(void *child_stack, unsigned long flags, int *ptid, int *ctid, unsigned long newtls); | Architecture s390 |
long clone(unsigned long flags, void *child_stack, int stack_size, int *ptid, int *ctid, unsigned long newtls); | Architecture microblaze |
Paramètres
Nom | Description | ||
---|---|---|---|
fn | Ce paramètre permet de retourner le résultat de la terminaison du processus par cette fonction. | ||
child_stack | Ce paramètre permet d'indiquer le résultat de la pile qu'utilisera le processus enfant. | ||
stack_size | Ce paramètre permet d'indiquer la taille de la pile. | ||
flags | Ce paramètre permet d'indiquer l'option : | ||
Constante | Version de noyau | Description | |
CLONE_CHILD_CLEARTID | Linux 2.5.49 | Cette constante permet d'effacer (mettre à zéro) l'identificateur du processus léger enfant du paramètre ctid dans la mémoire enfant lorsque l'enfant se termine, et se réactiver sur le futex à cette adresse. L'adresse impliquée peut être modifiée par l'appel système set_tid_address. | |
CLONE_CHILD_SETTID | Linux 2.5.49 | Cette constante permet d'entreposer l'identificateur de processus léger enfant du paramètre ctid dans la mémoire de l'enfant. L'opération d'entreposage se termine avant que clone() retourne le contrôle à l'espace utilisateur. | |
CLONE_FILES | Linux 2.0 | Cette constante permet d'indiquer que le processus appelant et le processus enfant partagent la même table de descripteur de fichier. Tout descripteur de fichier créé par le processus appelant ou par le processus enfant est également valide dans l'autre processus. De même, si l'un des processus ferme un descripteur de fichier ou modifie ses indicateurs associés (à l'aide de l'opération F_SETFD de fcntl), l'autre processus est également affecté. Si un processus partageant une table de descripteurs de fichier appelle execve, sa table de descripteur de fichier est dupliquée (non partagée). | |
CLONE_FS | Linux 2.0 | Cette constante permet d'indiquer que l'appelant et le processus enfant partagent le mêmes informations sur le système de fichiers. Cela inclut la racine du système de fichiers, le répertoire de travail en cours et le umask. Tout appel à chroot, chdir ou umask effectué par le processus d'appel ou le processus de l'enfant affecte également l'autre processus. | |
CLONE_IO | Linux 2.6.25 | Cette constante permet d'indiquer que le nouveau processus partage un contexte d'entrée/sortie avec le processus appelant. Si ce drapeau n'est pas défini, alors (comme avec fork) le nouveau processus a son propre contexte d'entrée/sortie. Le contexte d'entrée/sortie est à la portée d'entrée/sortie du planificateur de disque (c'est-à-dire, ce que le planificateur d'entrée/sortie utilise pour modéliser la planification des entrées/sorties d'un processus). Si les processus partagent le même contexte d'entrée/sortie, ils sont traités comme un seul par le planificateur d'entrée/sortie. En conséquence, ils partagent le temps de disque. Pour certains planificateurs d'entrée/sortie, si 2 processus partagent un contexte d'entrée/sortie, ils seront autorisés à entrelacer leur accès au disque. Si plusieurs processus léger effectuent des entrées/sorties au nom du même processus (aio_read, par exemple), ils doivent utiliser CLONE_IO pour obtenir de meilleures performances d'entrée/sortie. Si le noyau n'est pas configuré avec l'option CONFIG_BLOCK, cet indicateur de pas d'opération. | |
CLONE_NEWCGROUP | Linux 4.6 | Cette constante permet de créer le processus dans un nouvel espace de noms de groupe. Si ce drapeau n'est pas défini, alors (comme avec fork) le processus est créé dans les mêmes espaces de noms de groupe que le processus appelant. Ce drapeau est destiné à l'intégration de conteneurs. Seul un processus privilégié (CAP_SYS_ADMIN) peut employer CLONE_NEWCGROUP. | |
CLONE_NEWIPC | Linux 2.6.19 | Cette constante permet de créer le processus dans un nouvel espace de noms IPC. Si ce drapeau n'est pas défini, alors (comme avec fork), le processus est créé dans le même espace de noms IPC que le processus appelant. Ce drapeau est destiné à l'intégration de conteneurs. | |
CLONE_NEWNET | Linux 2.6.24 | Cette constante permet de créer le processus dans un nouvel espace de noms de réseau. Si ce drapeau n'est pas défini, alors (comme avec fork) le processus est créé dans le même espace de noms réseau que le processus appelant. Ce drapeau est destiné à l'intégration de conteneurs. | |
CLONE_NEWNS | Linux 2.4.19 | Cette constante permet de créer le processus dans un nouvel espace de noms de réseau. Si ce drapeau n'est pas défini, alors (comme avec fork) le processus est créé dans le même espace de noms réseau que le processus appelant. Ce drapeau est destiné à l'intégration de conteneurs. | |
CLONE_NEWPID | Linux 2.6.24 | Cette constante permet de créer le processus dans un nouvel espace de noms PID. Si ce drapeau n'est pas défini, alors (comme avec fork) le processus est créé dans le même espace de noms PID que le processus appelant. Ce drapeau est destiné à l'intégration de conteneurs. | |
CLONE_NEWUSER | Linux 2.6.23 | Cette constante permet de créer le processus dans un nouvel espace de noms d'utilisateur. Si ce drapeau n'est pas défini, alors (comme avec fork) le processus est créé dans le même espace de noms utilisateur que le processus appelant. | |
CLONE_NEWUTS | Linux 2.6.19 | Cette constante permet de créer le processus dans un nouvel espace de noms UTS, dont les identificateurs sont initialisés en dupliquant les identificateurs à partir de l'espace de noms UTS du processus appelant. Si ce drapeau n'est pas défini, alors (comme avec fork) le processus est créé dans le même espace de noms UTS que le processus appelant. Ce drapeau est destiné à l'intégration de conteneurs. | |
CLONE_PARENT | Linux 2.3.12 | Cette constante permet d'indiquer que le parent du nouvel enfant (tel que renvoyé par getppid) sera le même que celui du processus appelant. | |
CLONE_PARENT_SETTID | Linux 2.5.49 | Cette constante permet d'entreposer l'identificateur de processus léger à du paramètre ptid dans la mémoire du parent. | |
CLONE_PID | Linux 2.0 à 2.5.15 | Cette constante permet d'indiquer que le processus enfant est créé avec le même identificateur de processus que le processus appelant. C'est bon pour le piratage du système, mais pas pour une utilisation. A partir de Linux 2.3.21, ce drapeau ne peut être spécifié que par le processus de démarrage du système (PID 0). Le drapeau a complètement disparu des sources du noyau dans Linux 2.5.16. Depuis lors, le noyau ignore silencieusement ce bit s'il est spécifié dans les drapeaux. | |
CLONE_PTRACE | Linux 2.2 | Cette constante permet d'indiquer que le processus appelant est tracé, et qu'il tracera également l'enfant (voir ptrace). | |
CLONE_SETTLS | Linux 2.5.32 | Cette constante permet d'indiquer que le descripteur TLS (Thread Local Storage) est défini sur NEWTLS. | |
CLONE_SIGHAND | Linux 2.0 | Cette constante permet d'indiquer que le processus appelant et le processus enfant partagent la même table de gestionnaires de signaux. Si le processus appelant ou le processus enfant appelle sigaction pour modifier le comportement associé à un signal, le comportement est également modifié dans l'autre processus. Cependant, le processus appelant et les processus enfants ont toujours des masques de signaux distincts et des ensembles de signaux en attente. Ainsi, l'un d'eux peut bloquer ou débloquer des signaux en utilisant sigprocmask sans affecter l'autre processus. | |
CLONE_STOPPED | Linux 2.6.0 à 2.6.38 | Cette constante permet d'indiquer que l'enfant est initialement arrêté (comme s'il recevait un signal SIGSTOP) et doit être repris en lui envoyant un signal SIGCONT. Ce drapeau a été abandonné à partir de Linux 2.6.25 et a été complètement supprimé dans Linux 2.6.38. Depuis lors, le noyau l'ignore silencieusement sans erreur. À partir de Linux 4.6, le même bit a été réutilisé pour l'indicateur CLONE_NEWCGROUP. | |
CLONE_SYSVSEM | Linux 2.5.10 | Cette constante permet d'indiquer que l'enfant et le processus appelant partagent une seule liste de valeurs d'ajustement de sémaphore System V (semadj) (voir semop). Dans ce cas, la liste partagée accumule des valeurs semadj dans tous les processus partageant la liste, et les ajustements de sémaphore sont effectués uniquement lorsque le dernier processus partageant la liste se termine (ou cesse de partager la liste en utilisant unshare). Si ce drapeau n'est pas défini, alors l'enfant a une liste séparée de semadj étant initialement vide. | |
CLONE_THREAD | Linux 2.4.0 | Cette constante permet d'indiquer que l'enfant est placé dans le même groupe de processus léger que le processus appelant. Pour rendre le reste de la discussion de CLONE_THREAD plus lisible, le terme «processus léger» est utilisé pour faire référence aux processus dans un groupe de processus léger. | |
CLONE_UNTRACED | Linux 2.5.46 | Cette constante permet d'indiquer qu'un processus de suivi ne peut pas forcer CLONE_PTRACE sur ce processus enfant. | |
CLONE_VFORK | Linux 2.2 | Cette constante permet d'indiquer que l'exécution du processus appelant est suspendue jusqu'à ce que l'enfant libère ses ressources de mémoire virtuelle via un appel à execve ou _exit (comme avec vfork). | |
CLONE_VM | Linux 2.0 | Cette constante permet d'indiquer que le processus appelant et le processus enfant s'exécutent dans le même espace mémoire. En particulier, les écritures mémoire effectuées par le processus appelant ou par le processus enfant sont également visibles dans l'autre processus. De plus, toute cartographie ou décartographie de mémoire effectué avec mmap ou munmap par le processus enfant ou appelant affecte également l'autre processus. | |
arg | Ce paramètre permet d'indiquer les paramètres de la fonction fn. | ||
ptid | Ce paramètre permet d'indiquer l'identificateur parent du processus léger. | ||
ctid | Ce paramètre permet d'indiquer l'identificateur enfant du processus léger. |
Description
Cette fonction permet de créer un processus enfant.
Remarques
- La fonction clone() contenu dans le glibc apporte des modifications dans la mémoire pointée par child_stack (modifications requises pour définir la pile correctement pour l'enfant) avant d'appeler la fonction système clone(). Ainsi, dans les cas où clone() est utilisé pour créer des enfants de manière récursive, n'utilisez pas le tampon utilisé pour la pile du parent comme pile de l'enfant.
- Différences entre la bibliothèque C et le noyau : L'appel système brute à clone() correspond plus étroitement à fork dans la mesure où l'exécution dans l'enfant continue à partir du point de l'appel. Ainsi, les paramètres fn et arg de la fonction de remplacement de clone() sont omis. Une autre différence pour l'appel système brute clone() est que le paramètre child_stack peut être NULL, auquel cas l'enfant utilise un doublon de la pile du parent (La sémantique de copie à l'écriture garantit que l'enfant obtient des copies séparées des pages de pile lorsque l'un ou l'autre processus modifie la pile). Dans ce cas, pour une opération correcte, l'option CLONE_VM ne doit pas être spécifiée. Si l'enfant partage la mémoire du parent en raison de l'utilisation de l'indicateur CLONE_VM, aucune copie en double ne se produit et un chaos est susceptible de se produire.
- L'ordre des paramètres diffère également dans l'appel système brut, et il existe des variations dans les paramètres entre les architectures.
Légende
Cette couleur permet d'indiquer que la fonction est obsolète ou abandonné par la plupart des distributions.
Dernière mise à jour : Dimanche, le 21 février 2016