focal (2) setns.2.gz

Provided by: manpages-fr-dev_3.65d1p1-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.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> ».