.\" -*- coding: UTF-8 -*- .\" Copyright 1993 Giorgio Ciucci .\" and Copyright 2015 Bill Pemberton .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" Modified Tue Oct 22 16:40:11 1996 by Eric S. Raymond .\" Modified Mon Jul 10 21:09:59 2000 by aeb .\" Modified 1 Jun 2002, Michael Kerrisk .\" Language clean-ups. .\" Enhanced and corrected information on msg_qbytes, MSGMNB and MSGMAX .\" Added note on restart behavior of msgsnd() and msgrcv() .\" Formatting clean-ups (argument and field names marked as .I .\" instead of .B) .\" Modified, 27 May 2004, Michael Kerrisk .\" Added notes on capability requirements .\" Modified, 11 Nov 2004, Michael Kerrisk .\" Language and formatting clean-ups .\" Added notes on /proc files .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH MSGOP 2 "1 novembre 2020" Linux "Manuel du programmeur Linux" .SH NOM msgrcv, msgsnd \- Opérations sur les files de messages System\ V .SH SYNOPSIS .nf \fB#include \fP \fB#include \fP \fB#include \fP .PP \fBint msgsnd(int \fP\fImsqid\fP\fB, const void *\fP\fImsgp\fP\fB, size_t \fP\fImsgsz\fP\fB, int \fP\fImsgflg\fP\fB);\fP .PP \fBssize_t msgrcv(int \fP\fImsqid\fP\fB, void *\fP\fImsgp\fP\fB, size_t \fP\fImsgsz\fP\fB, long \fP\fImsgtyp\fP\fB,\fP \fB int \fP\fImsgflg\fP\fB);\fP .fi .SH DESCRIPTION Les appels système \fBmsgsnd\fP() et \fBmsgrcv\fP() servent respectivement à envoyer et à recevoir des messages d'une file de messages System\ V. Le processus appelant doit avoir une permission d'écriture sur la file pour envoyer un message, et une permission de lecture pour en recevoir un. .PP L'argument \fImsgp\fP est un pointeur vers une structure définie par l'appelant de la forme générale suivante\ : .PP .in +4n .EX struct msgbuf { long mtype; /* type de message, doit être > 0 */ char mtext[1]; /* contenu du message */ }; .EE .in .PP Le champ \fImtext\fP est un tableau (ou une autre structure) de taille \fImsgsz\fP, valeur entière positive ou nulle. Les messages de taille nulle (sans champ \fImtext\fP) sont autorisés. Le membre \fImtype\fP doit avoir une valeur strictement positive qui puisse être utilisée par le processus lecteur pour la sélection de messages (voir la description de \fBmsgrcv\fP() ci\(hydessous). .SS msgsnd() L'appel système \fBmsgsnd\fP() insère une copie du message pointé par l'argument \fImsgp\fP dans la file dont l'identifiant est indiqué par la valeur de l'argument \fImsqid\fP. .PP S'il y a assez de place dans la file, \fBmsgsnd\fP() réussit immédiatement. La capacité de la file est régie par le champ \fImsg_qbytes\fP de la structure associée à la file de messages. Durant la création de la file, ce champ est initialisé à \fBMSGMNB\fP octets, mais cette limite peut être modifiée avec \fBmsgctl\fP(2). Une file de message est considérée pleine si une de ces conditions est remplie\ : .IP \(bu 2 Après l'ajout d'un message à la file, le nombre total d'octets dans la file aurait dépassé la taille maximale de la file (champ \fImsg_qbytes\fP). .IP \(bu Après l'ajout d'un message à la file, le nombre total de messages dans la file aurait dépassé la taille maximale de la file (champ \fImsg_qbytes\fP).Cette vérification permet d'éviter qu'un nombre illimité de messages de taille nulle soit ajouté à la file. Bien que tels messages ne contiennent pas de données, ils consomment néanmoins de la mémoire du noyau, sujette à un verrou. .PP S'il n'y a pas assez de place, alors le comportement par défaut de \fBmsgsnd\fP() est de bloquer jusqu'à obtenir suffisamment d'espace. En indiquant \fBIPC_NOWAIT\fP dans l'argument \fImsgflg\fP, le message ne sera pas envoyé et l'appel système échouera en retournant \fBEAGAIN\fP dans \fBerrno\fP. .PP Un appel à \fBmsgsnd\fP() bloqué peut échouer si\ : .IP \(bu 2 la file est supprimée, auquel cas l'appel système échoue avec \fIerrno\fP valant \fBEIDRM\fP\ ; ou .IP \(bu un signal a été intercepté, auquel cas l'appel système échoue avec \fIerrno\fP valant \fBEINTR\fP\ ; consultez \fBsignal\fP(7). (\fBmsgsnd\fP() n'est jamais relancé automatiquement après interruption par un gestionnaire de signal, quelle que soit la configuration de \fBSA_RESTART\fP lors de l'installation du gestionnaire.) .PP Si l'appel système réussit, la structure décrivant la file de messages est mise à jour comme suit. .IP \(bu 2 \fImsg_lspid\fP contient le PID du processus appelant. .IP \(bu \fImsg_qnum\fP est incrémenté de \fB1\fP. .IP \(bu \fImsg_stime\fP est rempli avec l'heure actuelle. .SS msgrcv() L'appel système \fBmsgrcv\fP() supprime un message depuis la file indiquée par \fImsqid\fP et le place dans le tampon pointé par \fImsgp\fP. .PP L'argument \fImsgsz\fP indique la taille maximale en octets du membre \fImtext\fP de la structure pointée par l'argument \fImsgp\fP. Si le contenu du message est plus long que \fImsgsz\fP octets, le comportement dépend de la présence ou non de \fBMSG_NOERROR\fP dans \fImsgflg\fP. Si \fBMSG_NOERROR\fP est spécifié, alors le message sera tronqué (et la partie tronquée sera perdue)\ ; si \fBMSG_NOERROR\fP n'est pas spécifié, le message ne sera pas extrait de la file, et l'appel système échouera en renvoyant \fB\-1\fP et en indiquant \fBE2BIG\fP dans \fIerrno\fP. .PP À moins que \fBMSG_COPY\fP ne soit indiqué dans \fImsgflg\fP (voir ci\-dessous), l’argument \fImsgtyp\fP indique le type de message désiré. .IP \(bu 2 Si \fImsgtyp\fP vaut \fB0\fP, le premier message est lu. .IP \(bu Si \fImsgtyp\fP est supérieur à \fB0\fP, alors le premier message de type \fImsgtyp\fP est extrait de la file. Si \fImsgflg\fP contient \fBMSG_EXCEPT\fP l'inverse est effectué, le premier message de type différent de \fImsgtyp\fP est extrait de la file. .IP \(bu Si \fImsgtyp\fP est inférieur à \fB0\fP, le premier message de la file avec un type le plus proche inférieur ou égal à la valeur absolue de \fImsgtyp\fP est extrait. .PP L'argument \fImsgflg\fP est composé d'un \fIOU\fP binaire «\ |\ » avec les attributs suivants. .TP \fBIPC_NOWAIT\fP S’arrêter immédiatement si aucun message du type désiré n'est présent dans la file. L'appel système échoue et \fIerrno\fP est configuré à \fBENOMSG\fP. .TP \fBMSG_COPY\fP (depuis Linux\ 3.8) .\" commit 4a674f34ba04a002244edaf891b5da7fc1473ae8 Récupérer une copie de façon non destructive du message dans la file à la position ordinale indiquée par \fImsgtyp\fP (les messages sont considérées numérotés à partir de \fB0\fP). .IP Cet attribut doit être indiqué en conjonction avec \fBIPC_NOWAIT\fP, de telle sorte que si aucun message n’est disponible à la position donnée, l’appel échoue immédiatement avec l’erreur \fBENOMSG\fP. Parce qu'ils modifient le sens de \fImsgtyp\fP de manière opposée, \fBMSG_COPY\fP et \fBMSG_EXCEPT\fP ne peuvent être définis simultanément dans \fImsgflg\fP. .IP L'attribut \fBMSG_COPY\fP a été ajouté pour l’implémentation du point de restauration du noyau et n’est disponible que si le noyau a été compilé avec l’option \fBCONFIG_CHECKPOINT_RESTORE\fP. .TP \fBMSG_EXCEPT\fP Utilisé avec \fImsgtyp\fP supérieur à \fB0\fP pour lire les messages de type différent de \fImsgtyp\fP. .TP \fBMSG_NOERROR\fP Tronquer silencieusement les messages plus longs que \fImsgsz\fP octets. .PP Si aucun message du type requis n'est disponible et si on n'a pas demandé \fBIPC_NOWAIT\fP dans \fImsgflg\fP, le processus appelant est bloqué jusqu'à l'occurrence d'un des événements suivants: .IP \(bu 2 Un message du type désiré arrive dans la file. .IP \(bu La file de messages est supprimée. L'appel système échoue et \fIerrno\fP contient \fBEIDRM\fP. .IP \(bu Le processus appelant intercepte un signal. Dans ce cas l'appel système échoue avec \fIerrno\fP valant \fBEINTR\fP. (\fBmsgrcv\fP() n'est jamais relancé automatiquement après interruption par un gestionnaire de signal, quelle que soit la configuration de \fBSA_RESTART\fP lors de l'installation du gestionnaire.) .PP Si l'appel système réussit, la structure décrivant la file de messages est mise à jour comme suit. .IP \fImsg_lrpid\fP est rempli avec le PID du processus appelant. .IP \fImsg_qnum\fP est décrémenté de \fB1\fP. .IP \fImsg_rtime\fP est rempli avec l'heure actuelle. .SH "VALEUR RENVOYÉE" En cas d'échec les deux appels système renvoient \fB\-1\fP et \fIerrno\fP contient le code d'erreur. Sinon \fBmsgsnd\fP() renvoie \fB0\fP et \fBmsgrcv\fP() renvoie le nombre d'octets copiés dans la table \fImtext\fP. .SH ERREURS En cas d'échec de \fBmsgsnd\fP(), \fIerrno\fP aura l'une des valeurs suivantes: .TP \fBEACCES\fP Le processus appelant n'a pas de permission de lecture dans la file et n'a pas la capacité \fBCAP_IPC_OWNER\fP dans l'espace de noms qui gère son espace de noms IPC. .TP \fBEAGAIN\fP Le message n'a pas pu être envoyé à cause de la limite \fImsg_qbytes\fP pour la file et de la requête \fBIPC_NOWAIT\fP dans \fImsgflg\fP. .TP \fBEFAULT\fP \fImsgp\fP pointe en dehors de l'espace d'adressage accessible. .TP \fBEIDRM\fP La file de messages a été supprimée. .TP \fBEINTR\fP Un signal est arrivé avant d'avoir pu écrire quoi que ce soit. .TP \fBEINVAL\fP \fImsqid\fP est n'est pas valable, ou bien \fImtype\fP n'est pas positif, ou bien \fImsgsz\fP est non valable (négatif ou supérieur à la valeur \fBMSGMAX\fP du système). .TP \fBENOMEM\fP Le système n'a pas assez de mémoire pour copier le message pointé par \fImsgp\fP. .PP En cas d'échec de \fBmsgrcv\fP(), \fIerrno\fP prend l'une des valeurs suivantes: .TP \fBE2BIG\fP Le message est plus long que \fImsgsz\fP, et \fBMSG_NOERROR\fP n'a pas été indiqué dans \fImsgflg\fP. .TP \fBEACCES\fP Le processus appelant n'a pas de permission de lecture dans la file et n'a pas la capacité \fBCAP_IPC_OWNER\fP dans l'espace de noms qui gère son espace de noms IPC. .TP \fBEFAULT\fP \fImsgp\fP pointe en dehors de l'espace d'adressage accessible. .TP \fBEIDRM\fP La file de messages a été supprimée alors que le processus attendait un message. .TP \fBEINTR\fP Un signal est arrivé avant d'avoir pu lire quoi que ce soit\ ; consultez \fBsignal\fP(7). .TP \fBEINVAL\fP \fImsgqid\fP n'était pas valable ou \fImsgsz\fP valait moins de \fB0\fP. .TP \fBEINVAL\fP (depuis Linux\ 3.14) \fImsgflg\fP définit \fBMSG_COPY\fP sans définir \fBIPC_NOWAIT\fP. .TP \fBEINVAL\fP (depuis Linux\ 3.14) \fImsgflg\fP définit à la fois \fBMSG_COPY\fP et \fBMSG_EXCEPT\fP. .TP \fBENOMSG\fP \fBIPC_NOWAIT\fP a été indiqué dans \fImsgflg\fP et aucun message du type réclamé n'existe dans la file. .TP \fBENOMSG\fP \fBIPC_NOWAIT\fP et \fBMSG_COPY\fP ont été indiqués dans \fImsgflg\fP et la file contient moins de \fImsgtyp\fP messages. .TP \fBENOSYS\fP (depuis Linux\ 3.8) \fBMSG_COPY\fP et \fBIPC_NOWAIT\fP ont été indiqués dans \fImsgflg\fP et le noyau a été configuré sans \fBCONFIG_CHECKPOINT_RESTORE\fP. .SH CONFORMITÉ POSIX.1\-2001, POSIX.1\-2008, SVr4. .PP .\" MSG_COPY since glibc 2.18 Les attributs \fBMSG_EXCEPT\fP et \fBMSG_COPY\fP sont spécifiques à Linux. Leur définition peut être obtenue en définissant la macro de test de fonctionnalités \fB_GNU_SOURCE\fP. .SH NOTES .\" Like Linux, the FreeBSD man pages still document .\" the inclusion of these header files. L'inclusion de \fI\fP et \fI\fP n'est pas nécessaire sous Linux et n'est exigée par aucune version de POSIX. Cependant, certaines implémentations anciennes nécessitent l'inclusion de ces fichiers d'en\-tête, et le SVID documente aussi leur inclusion. Les applications ayant pour but d'être portables pourraient inclure ces fichiers d'en\-tête. .PP L'argument \fImsgp\fP est déclaré comme un \fIstruct msgbuf\ *\fP avec les bibliothèques glibc\ 2.0 et glibc\ 2.1. Il est déclaré comme un \fIvoid\ *\fP avec la bibliothèque glibc\ 2.2, suivant ainsi les spécifications SUSv2 et SUSv3. .PP Les limites suivantes concernent les files de messages et affectent l’appel \fBmsgsnd\fP(). .TP \fBMSGMAX\fP Taille maximale d'un message texte, en octets (valeur par défaut\ : 8192 octets). Sous Linux, cette limite peut être lue et modifiée grâce au fichier \fI/proc/sys/kernel/msgmax\fP). .TP \fBMSGMNB\fP Nombre maximal d'octets d'une file de messages (valeur par défaut\ : 16384 octets. Sous Linux, elle peut être lue et modifiée grâce au fichier \fI/proc/sys/kernel/msgmnb\fP). Un processus privilégié (sous Linux\ : avec la capacité \fBCAP_SYS_RESOURCE\fP) peut augmenter la taille d'une file de messages au\-delà de \fBMSGMNB\fP en utilisant l’opération \fBIPC_SET\fP de \fBmsgctl\fP(2). .PP L'implémentation des files de messages sous Linux n'a pas de limites système intrinsèques ni pour le nombre d'en\(hytêtes de messages (\fBMSGTQL\fP) ni pour la taille, en octets, de l'ensemble de tous les messages (\fBMSGPOOL\fP). .SH BOGUES .\" http://marc.info/?l=linux-kernel&m=139048542803605&w=2 .\" commit 4f87dac386cc43d5525da7a939d4b4e7edbea22c Jusqu'à la version Linux\ 3.13, si \fBmsgrcv\fP() était appelé avec l’attribut \fBMSG_COPY\fP, mais sans \fBIPC_NOWAIT\fP, et que la file de messages contenait moins de \fBmsgtyp\fP messages, alors l’appel bloquait jusqu’à ce que le message suivant soit écrit dans la file. À ce moment là, l’appel renvoyait une copie du message, \fIquelle que soit\fP la position ordinale \fImsgtyp\fP de ce message. Ce bogue est corrigé depuis Linux\ 3.14. .PP .\" http://marc.info/?l=linux-kernel&m=139048542803605&w=2 .\" commit 4f87dac386cc43d5525da7a939d4b4e7edbea22c Indiquer à la fois \fBMSG_COPY\fP et \fBMSC_EXCEPT\fP dans \fImsgflg\fP est une erreur de logique (puisque ces attributs imposent des interprétations différentes de \fImsgtyp\fP). Jusqu'à Linux\ 3.13, cette erreur n’était pas diagnostiquée par \fImsgsrv\fP(). Ce bogue est corrigé depuis Linux\ 3.14. .SH EXEMPLES Le programme ci\-dessous montre l'utilisation de \fBmsgsnd\fP() et de \fBmsgrcv\fP(). .PP Le programme d'exemple est d'abord exécuté avec l'option \fB\-s\fP pour envoyer un message, puis réexécuté avec l'option \fB\-r\fP pour recevoir un message. .PP La session d'interpréteur suivant montre un échantillon d'exécution du programme\ : .PP .in +4n .EX $\fB ./a.out \-s\fP envoi : un message le mercredi 4 mars 2015 à 16:25:45 $\fB ./a.out \-r\fP message reçu : un message le mercredi 4 mars 2015 à 16:25:45 .EE .in .SS "Source du programme" \& .EX #include #include #include #include #include #include #include #include #include struct msgbuf { long mtype; char mtext[80]; }; static void usage(char *prog_name, char *msg) { if (msg != NULL) fputs(msg, stderr); fprintf(stderr, "Utilisation : %s [options]\en", nom_prog); fprintf(stderr, "Les options sont :\en"); fprintf(stderr, "\-s envoyer un message en utilisant msgsnd()\en"); fprintf(stderr, "\-r lire un message en utilisant msgrcv()\en"); fprintf(stderr, "\-t type de message (1 par défaut)\en"); fprintf(stderr, "\-k clé de la file de messages (1234 par défaut)\en"); exit(EXIT_FAILURE); } static void send_msg(int qid, int msgtype) { struct msgbuf msg; time_t t; msg.mtype = msgtype; time(&t); snprintf(msg.mtext, sizeof(msg.mtext), "un message à %s", ctime(&t)); if (msgsnd(qid, &msg, sizeof(msg.mtext), IPC_NOWAIT) == \-1) { perror("msgsnd error"); exit(EXIT_FAILURE); } printf("envoyé : %s\en", msg.mtext); } static void get_msg(int qid, int msgtype) { struct msgbuf msg; if (msgrcv(qid, &msg, sizeof(msg.mtext), msgtype, MSG_NOERROR | IPC_NOWAIT) == \-1) { if (errno != ENOMSG) { perror("msgrcv"); exit(EXIT_FAILURE); } printf("Aucun message disponible pour msgrcv()\en"); } else printf("message reçu : %s\en", msg.mtext); } int main(int argc, char *argv[]) { int qid, opt; int mode = 0; /* 1 = envoyé, 2 = reçu */ int msgtype = 1; int msgkey = 1234; while ((opt = getopt(argc, argv, "srt:k:")) != \-1) { switch (opt) { case \(aqs\(aq: mode = 1; break; case \(aqr\(aq: mode = 2; break; case \(aqt\(aq: msgtype = atoi(optarg); if (msgtype <= 0) usage(argv[0], "l'option \-t doit être plus grande que 0\en"); break; case \(aqk\(aq: msgkey = atoi(optarg); break; default: usage(argv[0], "option non reconnue\en"); } } if (mode == 0) usage(argv[0], "doit être l'option \-s ou \-r \en"); qid = msgget(msgkey, IPC_CREAT | 0666); if (qid == \-1) { perror("msgget"); exit(EXIT_FAILURE); } if (mode == 2) get_msg(qid, msgtype); else send_msg(qid, msgtype); exit(EXIT_SUCCESS); } .EE .SH "VOIR AUSSI" \fBmsgctl\fP(2), \fBmsgget\fP(2), \fBcapabilities\fP(7), \fBmq_overview\fP(7), \fBsysvipc\fP(7) .SH COLOPHON Cette page fait partie de la publication\ 5.10 du projet \fIman\-pages\fP 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/. .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot et Jean-Philippe MENGUAL . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .