kcmp(2) System Calls Manual kcmp(2) NOM kcmp - comparer deux processus afin de determiner s'ils partagent des ressources du noyau BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include /* Definition des constantes KCMP_* */ #include /* Definition des constantes SYS_* */0 #include int syscall(SYS_kcmp, pid_t pid1, pid_t pid2, int type,0 unsigned long idx1, unsigned long idx2); Note : la glibc ne fournit pas d'enveloppe autour de kcmp(), necessitant l'utilisation de syscall(2). DESCRIPTION L'appel systeme kcmp() peut etre utilise pour verifier si deux processus identifies par pid1 et pid2 partagent des ressources du noyau, telles que de la memoire virtuelle, des descripteurs de fichiers (FD), etc. Le droit d'utiliser kcmp() est regi par les droits d'acces de ptrace aux verifications PTRACE_MODE_READ_REALCREDS vis-a-vis de pid1 et de pid2 ; voir ptrace(2). L'argument type indique pour quelle ressource une comparaison doit etre effectuee entre les deux processus. Il peut prendre l'une des valeurs suivantes : KCMP_FILE Verifier si un descripteur de fichier (FD) idx1 utilise par le processus pid1 fait reference a la meme description de fichier ouvert (consultez open(2)) que le descripteur de fichier idx2 utilise par le processus pid2. L'existence de deux descripteurs de fichiers se rapportant a la meme description de fichier ouvert peut resulter d'un dup(2) (et equivalent), d'un fork(2), ou du passage de descripteurs de fichiers a l'aide d'un socket de domaine (consultez unix(7)). KCMP_FILES Verifier si le processus partage un meme 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 Verifier si les processus partagent les meme informations relatives au systeme de fichiers (c'est-a-dire le masque de creation de mode de fichiers, le repertoire de travail et la racine du systeme 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 Verifier 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 Verifier si les processus partagent la meme 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 Verifier si les processus partagent la meme liste d'operations << undo >> pour les semaphores 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 Verifier si les processus partagent le meme 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) Verifier si le descripteur de fichier idx1 du processus pid1 est present dans l'instance epoll(7) decrite par idx2 du processus pid2. Le parametre idx2 est un pointeur vers une structure ou est decrit 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 renvoye depuis epoll_create(2), tfd est un numero de descripteur de fichier cible et toff est une position du fichier cible determinee a partir de zero. Plusieurs cibles peuvent etre enregistrees avec le meme numero de descripteur de fichier, indiquer une position aide donc a examiner chacune d'elles. Remarquez que kcmp() n'est pas a l'abri de << faux positifs >> qui peuvent survenir si des taches sont en cours d'execution. Pour obtenir des resultats pertinents, on peut arreter ces taches au moyen de l'appel systeme SIGSTOP (consulter signal(7)) avant de commencer l'examen avec cet appel systeme pour des resultats plus significatifs. VALEUR RENVOYEE La valeur renvoyee par un appel reussi a kcmp() est le resultat de la comparaison arithmetique des pointeurs du noyau (lorsque le noyau compare des ressources, il utilise leurs adresses en memoire). Pour mieux comprendre, regardons l'exemple suivant. Supposons que v1 et v2 sont les adresses des ressources concernees, alors la valeur renvoyee sera l'une des suivantes : 0 v1 est egal a v2 ; en d'autres termes, les deux processus partagent la meme ressource. 1 v1 est inferieur a v2. 2 v1 est superieur a v2. 3 v1 n'est pas egal a v2, mais aucune information concernant l'ordre n'est disponible. En cas d'erreur, la valeur de retour est -1 et errno est definie pour preciser l'erreur. kcmp() a ete concu pour renvoyer des variables pouvant etre triees. C'est particulierement 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 designe par idx2 depasse l'espace d'adressage de l'utilisateur. EINVAL type n'est pas valable. ENOENT Le fichier cible n'est pas present dans l'instance epoll(7). EPERM Permissions insuffisantes pour inspecter les ressources du processus. Le privilege CAP_SYS_PTRACE est necessaire pour inspecter les processus dont vous n'etes pas proprietaire. D'autres limites de ptrace peuvent egalement 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. STANDARDS Linux. HISTORIQUE Linux 3.5. Avant Linux 5.12, cet appel systeme n'etait disponible que si le noyau avait ete configure avec CONFIG_CHECKPOINT_RESTORE, vu que le but originel de cet appel systeme etait pour la fonctionnalite de gel des applications (checkpoint/restore) dans l'espace utilisateur (CRIU) (l'alternative a cet appel systeme aurait consiste a presenter les informations pertinentes concernant le processus a l'aide du systeme de fichier proc(5) ; cette solution n'a pas ete jugee satisfaisante pour des raisons de securite). Depuis Linux 5.12, cet appel systeme est disponible egalement si le noyau est configure avec CONFIG_KCMP. NOTES Consultez clone(2) pour obtenir des informations generales sur les ressources partagees 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 a la meme description de fichiers (FD) ouverts. Le programme teste differents cas pour les pairs de descripteurs de fichiers (FD), comme le decrit sa sortie. Un exemple d'execution 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 dupliques issus de processus differents : kcmp(1145, 1144, KCMP_FILE, 3, 3) ==> same Fichier enfant ouvert sur FD 4 Comparaison des FDs issus d'open()s distincts dans le meme processus : kcmp(1145, 1145, KCMP_FILE, 3, 4) ==> different Le FD 3 duplique enfant pour creer le FD 5 Comparaison des FDs dupliques dans le meme processus : kcmp(1145, 1145, KCMP_FILE, 3, 5) ==> same Source du programme #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include 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(void) { int fd1, fd2, fd3; static const char pathname[] = "/tmp/kcmp.test"; fd1 = open(pathname, O_CREAT | O_RDWR, 0600); if (fd1 == -1) err(EXIT_FAILURE, "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: err(EXIT_FAILURE, "fork"); case 0: printf("Le PID de l'enfant de fork() est %jd\n", (intmax_t) getpid()); test_kcmp("Comparer les FDs dupliques issus de processus differents :", getpid(), getppid(), fd1, fd1); fd2 = open(pathname, O_CREAT | O_RDWR, 0600); if (fd2 == -1) err(EXIT_FAILURE, "open"); printf("L'enfant a ouvert le fichier sur le FD %d\n", fd2); test_kcmp("Comparer des FDs issus des memes processus open()s :", getpid(), getpid(), fd1, fd2); fd3 = dup(fd1); if (fd3 == -1) err(EXIT_FAILURE, "dup"); printf("L'enfant a duplique le FD %d pour creer le FD %d\n", fd1, fd3); test_kcmp("Comparaison de FDs dupliques dans le meme processus :", getpid(), getpid(), fd1, fd3); break; default: wait(NULL); } exit(EXIT_SUCCESS); } VOIR AUSSI clone(2), unshare(2) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Cedric Boutillier , Frederic Hantrais et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 kcmp(2)