Provided by: manpages-fr-dev_4.13-4_all bug

NOM

       kcmp - comparer deux processus afin de déterminer s'ils partagent des ressources du noyau

SYNOPSIS

       #include <linux/kcmp.h>

       int kcmp(pid_t pid1, pid_t pid2, int type,
                unsigned long idx1, unsigned long idx2);

       Note : il n'existe pas d'enveloppe pour cet appel système dans la glibc ; voir NOTES.

DESCRIPTION

       L'appel  système   kcmp() peut être utilisé pour vérifier si deux processus identifiés par
       pid1 et pid2 partagent des ressources du noyau, telles que de la  mémoire  virtuelle,  des
       descripteurs de fichiers (FD), etc.

       Le  droit  d'utiliser  kcmp()  est régi par les droits d'accès de ptrace aux vérifications
       PTRACE_MODE_READ_REALCREDS vis-à-vis de pid1 et de pid2 ; voir ptrace(2).

       L'argument type indique pour quelle ressource une comparaison doit  être  effectuée  entre
       les deux processus. Il peut prendre l'une des valeurs suivantes :

       KCMP_FILE
              Vérifier  si un descripteur de fichier (FD) idx1 utilisé par le processus pid1 fait
              référence à la même description  de  fichier  ouvert  (consultez  open(2))  que  le
              descripteur  de  fichier  idx2  utilisé  par le processus pid2. L'existence de deux
              descripteurs de fichiers se rapportant à la même description de fichier ouvert peut
              résulter  d'un  dup(2) (et équivalent), d'un fork(2), ou du passage de descripteurs
              de fichiers à l'aide d'un socket de domaine (consultez unix(7)).

       KCMP_FILES
              Vérifier si le processus partage un  même  ensemble  de  descripteurs  de  fichiers
              ouverts.  Les arguments idx1 et idx2 ne sont pas pris en compte. Consultez le point
              sur l'attribut CLONE_FILES dans clone(2).

       KCMP_FS
              Vérifier si les processus partagent les même informations relatives au  système  de
              fichiers  (c'est-à-dire le masque de création de mode de fichiers, le répertoire de
              travail et la racine du système de fichiers). Les arguments idx1 et  idx2  ne  sont
              pas pris en compte. Voir le point sur l'attribut CLONE_FS dans clone(2).

       KCMP_IO
              Vérifier  si les processus partagent un contexte E/S. Les arguments idx1 et idx2 ne
              sont pas pris en compte. Voir le point sur l'attribut CLONE_IO dans clone(2).

       KCMP_SIGHAND
              Vérifier si les processus partagent la même table de disposition des  signaux.  Les
              arguments  idx1  et  idx2  ne sont pas pris en compte. Voir le point sur l'attribut
              CLONE_SIGHAND dans clone(2).

       KCMP_SYSVSEM
              Vérifier si les processus partagent la même liste d'opérations  « undo »  pour  les
              sémaphores System V. Les arguments idx1 et idx2 ne sont pas pris en compte. VOir le
              point sur l'attribut CLONE_SYSVSEM dans clone(2).

       KCMP_VM
              Vérifier si les processus partagent le même espace d'adressage. Les arguments  idx1
              et  idx2  ne  sont  pas  pris en compte. Voir le point sur l'attribut CLONE_VM dans
              clone(2).

       KCMP_EPOLL_TFD (depuis Linux 4.13)
              Vérifier si le descripteur de fichier idx1  du  processus  pid1  est  présent  dans
              l'instance  epoll(7)  décrite  par idx2 du processus pid2. Le paramètre idx2 est un
              pointeur vers une structure où est décrit le fichier cible. Cette  structure  prend
              la forme :

           struct kcmp_epoll_slot {
               __u32 efd;
               __u32 tfd;
               __u64 toff;
           };

       Dans   cette   structure,   efd  est  un  descripteur  de  fichier  epoll  renvoyé  depuis
       epoll_create(2), tfd est un numéro de  descripteur  de  fichier  cible  et  toff  est  une
       position  du  fichier  cible  déterminée  à  partir de zéro. Plusieurs cibles peuvent être
       enregistrées avec le même numéro de descripteur de fichier,  indiquer  une  position  aide
       donc à examiner chacune d'elles.

       Remarquez  que  kcmp() n'est pas à l'abri de « faux positifs » qui peuvent survenir si des
       tâches sont en cours d'exécution. Pour obtenir des résultats pertinents, on  peut  arrêter
       ces  tâches  au  moyen de l'appel système SIGSTOP (consulter signal(7)) avant de commencer
       l'examen avec cet appel système pour des résultats plus significatifs.

VALEUR RENVOYÉE

       La valeur renvoyée par un appel  réussi  à  kcmp()  est  le  résultat  de  la  comparaison
       arithmétique  des  pointeurs du noyau (lorsque le noyau compare des ressources, il utilise
       leurs adresses en mémoire).

       Pour mieux comprendre, regardons l'exemple suivant.  Supposons  que  v1  et  v2  sont  les
       adresses des ressources concernées, alors la valeur renvoyée sera l'une des suivantes :

           0   v1  est  égal  à  v2 ;  en  d'autres  termes, les deux processus partagent la même
               ressource.

           1   v1 est inférieur à v2.

           2   v1 est supérieur à v2.

           3   v1 n'est  pas  égal  à  v2,  mais  aucune  information  concernant  l'ordre  n'est
               disponible.

       En cas d'erreur, la valeur de retour est -1, et errno est défini de façon appropriée.

       kcmp() a été conçu pour renvoyer des variables pouvant être triées. C'est particulièrement
       pratique lorsqu'on souhaite comparer un grand nombre de descripteurs de fichiers.

ERREURS

       EBADF  type est KCMP_FILE et fd1 ou fd2 n'est pas un descripteur de fichier ouvert.

       EFAULT L'emplacement epoll désigné par idx2 dépasse l'espace d'adressage de l'utilisateur.

       EINVAL type n'est pas valable.

       ENOENT Le fichier cible n'est pas présent dans l'instance epoll(7).

       EPERM  Permissions insuffisantes pour inspecter les ressources du processus. Le  privilège
              CAP_SYS_PTRACE  est  nécessaire  pour  inspecter les processus dont vous n'êtes pas
              propriétaire. D'autres limites de ptrace peuvent également s'appliquer, telles  que
              CONFIG_SECURITY_YAMA qui, lorsque /proc/sys/kernel/yama/ptrace_scope vaut 2, limite
              kcmp() aux processus enfants ; voir ptrace(2).

       ESRCH  Au moins l'un des processus pid1 ou pid2 n'existe pas.

VERSIONS

       L'appel système kcmp() a fait son apparition dans la version 3.5 de Linux.

CONFORMITÉ

       kcmp() est spécifique à Linux et ne doit pas être utilisé dans des programmes conçus  pour
       être portables.

NOTES

       La  glibc  ne  fournit  pas  de  fonction  autour  de  cet appel système ; appelez-le avec
       syscall(2).

       Cet  appel  système  n'est  disponible  que   si   le   noyau   a   été   configuré   avec
       CONFIG_CHECKPOINT_RESTORE.  Cet appel est utilisé principalement pour la fonctionnalité de
       gel des applications (checkpoint/restore) dans l'espace utilisateur (CRIU).  L'alternative
       à cet appel système aurait consisté à présenter les informations pertinentes concernant le
       processus à l’aide du système de fichier  proc(5) ;  cette  solution  n'a  pas  été  jugée
       satisfaisante pour des raisons de sécurité.

       Consultez  clone(2)  pour  obtenir des informations générales sur les ressources partagées
       dont il est fait mention dans cette page.

EXEMPLES

       Le programme ci-dessous utilise kcmp()  pour  tester  si  les  pairs  de  descripteurs  de
       fichiers  renvoient  à  la  même  description de fichiers (FD) ouverts. Le programme teste
       différents cas pour les pairs de descripteurs de fichiers (FD), comme le décrit sa sortie.
       Un exemple d'exécution du programme suit :

           $ ./a.out
           Le PID parent est 1144
           Fichier ouvert parent sur FD 3

           Le PID de l'enfant de fork() est 1145
                Comparaison des FDs dupliqués issus de processus différents :
                     kcmp(1145, 1144, KCMP_FILE, 3, 3) ==> same
           Fichier enfant ouvert sur FD 4
                Comparaison des FDs issus d'open()s distincts dans le même processus :
                     kcmp(1145, 1145, KCMP_FILE, 3, 4) ==> different
           Le FD 3 dupliqué enfant pour créer le FD 5
                Comparaison des FDs dupliqués dans le même processus :
                     kcmp(1145, 1145, KCMP_FILE, 3, 5) ==> same

   Source du programme

       #define _GNU_SOURCE
       #include <sys/syscall.h>
       #include <sys/wait.h>
       #include <sys/stat.h>
       #include <stdint.h>
       #include <stdlib.h>
       #include <stdio.h>
       #include <unistd.h>
       #include <fcntl.h>
       #include <linux/kcmp.h>

       #define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                               } while (0)

       static int
       kcmp(pid_t pid1, pid_t pid2, int type,
            unsigned long idx1, unsigned long idx2)
       {
           return syscall(SYS_kcmp, pid1, pid2, type, idx1, idx2);
       }

       static void
       test_kcmp(char *msg, pid_t pid1, pid_t pid2, int fd_a, int fd_b)
       {
           printf("\t%s\n", msg);
           printf("\t\tkcmp(%jd, %jd, KCMP_FILE, %d, %d) ==> %s\n",
                   (intmax_t) pid1, (intmax_t) pid2, fd_a, fd_b,
                   (kcmp(pid1, pid2, KCMP_FILE, fd_a, fd_b) == 0) ?
                               "same" : "different");
       }

       int
       main(int argc, char *argv[])
       {
           int fd1, fd2, fd3;
           char pathname[] = "/tmp/kcmp.test";

           fd1 = open(pathname, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
           if (fd1 == -1)
               errExit("open");

           printf("Le PID parent est %jd\n", (intmax_t) getpid());
           printf("Fichier ouvert parent sur le FD %d\n\n", fd1);

           switch (fork()) {
           case -1:
               errExit("fork");

           case 0:
               printf("Le PID de l'enfant de fork() est %jd\n", (intmax_t) getpid());

       test_kcmp("Comparaison des FDs dupliqués issus de différents processus :",
                       getpid(), getppid(), fd1, fd1);

               fd2 = open(pathname, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
               if (fd2 == -1)
                   errExit("open");
               printf("Fichier enfant ouvert sur FD %d\n", fd2);

               test_kcmp("Comparer des FDs issus des mêmes processus open()s :",
                       getpid(), getpid(), fd1, fd2);

               fd3 = dup(fd1);
               if (fd3 == -1)
                   errExit("dup");
               printf("FD dupliqué enfant %d pour créer le FD %d\n", fd1, fd3);

               test_kcmp("Comparaison de FDs dupliqués dans le même processus :",
                       getpid(), getpid(), fd1, fd3);
               break;

           default:
               wait(NULL);
           }

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       clone(2), unshare(2)

COLOPHON

       Cette  page  fait partie de la publication 5.10 du projet man-pages Linux. Une description
       du projet et des instructions pour signaler des anomalies et la dernière version de  cette
       page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

TRADUCTION

       La  traduction  française  de  cette  page  de  manuel  a  été créée par Christophe Blaess
       <https://www.blaess.fr/christophe/>, Stéphan  Rafin  <stephan.rafin@laposte.net>,  Thierry
       Vignaud  <tvignaud@mandriva.com>,  François Micaux, Alain Portal <aportal@univ-montp2.fr>,
       Jean-Philippe   Guérard   <fevrier@tigreraye.org>,   Jean-Luc   Coulon   (f5ibh)    <jean-
       luc.coulon@wanadoo.fr>,    Julien    Cristau    <jcristau@debian.org>,    Thomas   Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin
       Duneau  <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis
       Barbier  <barbier@debian.org>,  David  Prévot   <david@tilapin.org>,   Cédric   Boutillier
       <cedric.boutillier@gmail.com>,  Frédéric  Hantrais  <fhantrais@gmail.com> et Jean-Philippe
       MENGUAL <jpmengual@debian.org>

       Cette traduction est une documentation libre ; veuillez vous reporter  à  la  GNU  General
       Public   License   version 3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  concernant  les
       conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un
       message à debian-l10n-french@lists.debian.org ⟨⟩.