Provided by: manpages-fr-dev_4.15.0-9_all bug

NOM

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

SYNOPSIS

       #include <linux/kcmp.h>       /* Definition of KCMP_* constants */
       #include <sys/syscall.h>      /* Definition of SYS_* constants */
       #include <unistd.h>

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

       Note: glibc provides no wrapper for kcmp(), necessitating the use of syscall(2).

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éfinie pour préciser l'erreur.

       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

       Before  Linux  5.12,  this  system call is available only if the kernel is configured with
       CONFIG_CHECKPOINT_RESTORE, since the original purpose of  the  system  call  was  for  the
       checkpoint/restore  in  user  space  (CRIU)  feature. (The alternative to this system call
       would have been to expose suitable process information via the proc(5)   filesystem;  this
       was  deemed  to be unsuitable for security reasons.) Since Linux 5.12, this system call is
       made available unconditionally.

       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.13 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⟩.