1. NOM

setns - Réassocier un thread avec un espace de noms

2. SYNOPSIS

 
Sélectionnez
#define _GNU_SOURCE             /* Consultez feature_test_macros(7) */
#include <sched.h>
int setns(int fd, int nstype);

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

4. VALEUR RENVOYÉE

S'il réussit, setns() renvoie zéro, sinon il renvoie -1 et remplit errno avec le code d'erreur.

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

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

7. CONFORMITÉ

L'appel système setns() est spécifique à Linux.

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

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

 
Sélectionnez
$ 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 :

 
Sélectionnez
# ./ns_exec /proc/3550/ns/uts /bin/bash
# uname -n             # Exécuté dans l'invite lancée par ns_exec
bizarro

9.1. Code du programme

 
Sélectionnez
#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");
}

10. VOIR AUSSI

clone(2), fork(2), vfork(2), proc(5), unix(7)

11. COLOPHON

Cette page fait partie de la publication 3.52 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/.

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

Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « LC_ALL=C man <section> <page_de_man> ».