NOM¶
setns - Réassocier un thread avec un espace de noms
SYNOPSIS¶
#define _GNU_SOURCE /* Consultez feature_test_macros(7) */
#include <sched.h>
int setns(int fd, int nstype);
DESCRIPTION¶
Étant donné un descripteur de fichiers faisant
référence à un espace de noms, réassocier le
thread appelant à cet espace de noms.
L'argument
fd est un descripteur de fichier faisant
référence à un des espaces de noms présents sous
la forme d'entrées dans un répertoire
/proc/[pid]/ns/.
Consultez
proc(5) pour plus d'informations sur
/proc/[pid]/ns.
Le thread appelant sera réassocié avec l'espace de noms
correspondant, si les contraintes imposées par l'argument
nstype
sont satisfaites.
L'argument
nstype indique les types d'espaces de noms auxquels le thread
appelant peut être réassocié. Cet argument peut prendre
une des valeurs suivantes :
- 0
- fd peut faire référence à n'importe quel type
d'espace de noms.
- CLONE_NEWIPC
- fd doit faire référence à un espace de noms
IPC.
- CLONE_NEWNET
- fd doit faire référence à un espace de noms
réseau.
- CLONE_NEWUTS
- fd doit faire référence à un espace de noms
UTS.
Définir la valeur de
nstype à zéro est suffisant si
le thread appelant connaît (ou n'a pas besoin de connaître) le
type d'espace de noms auquel
fd fait référence.
Définir
nstype à une valeur non nulle est utile si
l'appelant ne connaît pas le type de l'espace de noms
référencé par
fd et veut s'assurer que l'espace de
noms est du type souhaité. (L'appelant pourrait ne pas connaître
le type de l'espace de noms auquel
fd fait référence si
le descripteur de fichiers a été ouvert par un autre processus
et qu'il a, par exemple, été passé à l'appelant
par une socket UNIX.)
VALEUR RENVOYÉE¶
S'il réussit,
setns() renvoie zéro, sinon il renvoie -1 et
remplit
errno avec le code d'erreur.
ERREURS¶
- EBADF
- fd n'est pas un descripteur de fichier valable.
- EINVAL
- fd fait référence à un espace de noms dont le
type ne correspond pas à celui indiqué dans nstype,
ou bien un problème s'est produit lors de la réassociation
du thread avec l'espace de noms indiqué.
- ENOMEM
- Impossible d'allouer suffisamment de mémoire pour changer l'espace
de noms indiqué.
- EPERM
- Le processus appelant n'avait pas les privilèges
(CAP_SYS_ADMIN) pour effectuer cette opération.
VERSIONS¶
L'appel système
setns() est apparu dans Linux 3.0 ; son
support a été ajouté dans la version 2.14 de la
glibc.
L'appel système
setns() est spécifique à Linux.
NOTES¶
Certains des attributs qui peuvent être partagés avec un nouveau
thread créé avec
clone(2) ne peuvent pas être
modifiés en utilisant
setns().
EXEMPLE¶
Le programme ci-dessous attend au moins deux arguments. Le premier
précise le chemin d'un fichier d'espace de noms dans un
répertoire
/proc/[pid]/ns/ qui doit exister
préalablement. Les arguments suivants précisent une commande et
ses arguments. Le programme ouvre le fichier d'espace de noms, s'associe
à l'espace de noms en utilisant
setns(), et exécute la
commande indiquée dans cet espace de noms.
La session d'invite de commandes suivante présente l'utilisation du
programme (compilé dans un binaire appelé
ns_exec) en
lien avec le programme
CLONE_NEWUTS donné en example dans la
page de manuel
clone(2) (compilé dans un binaire appelé
newuts).
Nous commençons par exécuter le programme donné à
titre d'exemple dans
clone(2) en tâche de fond. Ce programme
crée un processus fils dans un espace de noms UTS distinct. Le
processus fils change le nom d'hôtes dans son espace de noms, puis les
deux processus affichent leur noms d'hôtes dans leurs espaces de noms
UTS respectifs, de façon à bien montrer leur différence.
$ su # Privilèges nécessaires aux opérations sur l'espace de noms
Mot de passe :
# ./newuts bizarro &
[1] 3549
clone() à renvoyé 3550
uts.nodename dans le fils : bizarro
uts.nodename dans le père : antero
# uname -n # Vérifier le nom d'hôte dans l'invite de commande
antero
Nous appelons alors le programme présenté ci-dessous afin de
lancer une invite de commande. Dans cette invite, on vérifie que le nom
d'hôte est bien celui défini par le processus fils
créé dans le premier programme :
# ./ns_exec /proc/3550/ns/uts /bin/bash
# uname -n # Exécuté dans l'invite lancée par ns_exec
bizarro
Code du programme¶
#define _GNU_SOURCE
#include <fcntl.h>
#include <sched.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
} while (0)
int
main(int argc, char *argv[])
{
int fd;
if (argc < 3) {
fprintf(stderr, "%s /proc/PID/ns/FILE cmd args...\n", argv[0]);
exit(EXIT_FAILURE);
}
fd = open(argv[1], O_RDONLY); /* Récupérer le descripteur pour
l'espace de noms */
if (fd == -1)
errExit("open");
if (setns(fd, 0) == -1) /* S'associer à l'espace de noms */
errExit("setns");
execvp(argv[2], &argv[2]); /* Exécuter la commande dans
l'espace de noms */
errExit("execvp");
}
VOIR AUSSI¶
clone(2),
fork(2),
vfork(2),
proc(5),
unix(7)
COLOPHON¶
Cette page fait partie de la publication 3.65 du projet
man-pages Linux.
Une description du projet et des instructions pour signaler des anomalies
peuvent être trouvées à l'adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet
manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce
document en utilisant la commande «
man -L C
<section>
<page_de_man> ».