Provided by: manpages-fr-dev_3.57d1p1-1_all bug

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.

CONFORMITÉ

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