Loading

NOM

       msgrcv, msgsnd - Opérations sur les messages

SYNOPSIS

       #include <sys/types.h>
       #include <sys/ipc.h>
       #include <sys/msg.h>

       int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

       ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
                      int msgflg);

       Les  appels  système  msgsnd()  et  msgrcv()  servent  respectivement à
       envoyer et à recevoir des messages d’une file de messages. 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.

       L’argument  msgp  est  un  pointeur  vers  une  structure  définie  par
       l’appelant de forme générale suivante :

           struct msgbuf {
               long mtype;       /* type de message, doit être > 0 */
               char mtext[1];    /* contenu du message */
           };

       Le  champ  mtext  est  un  tableau  ou autre structure de taille msgsz,
       valeur entière positive ou nulle. Les message  de  taille  nulle  (sans
       champ  mtext)  sont  autorisés.  Le  membre mtype 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  msgrcv
       ci‐dessous).

   msgsnd()
       L’appel système  msgsnd()  insère  une  copie  du  message  pointé  par
       l’argument  msgp  dans  la  file  dont l’identifiant est indiqué par la
       valeur de l’argument msqid.

       S’il y a assez de place dans la file, msgsnd()  réussit  immédiatement.
       (La  capacité  de  la  file  est  définie  par le champ msg_bytes de la
       structure associée à la file de messages.  Durant  la  création  de  la
       file,  ce  champ est initialisé à MSGMNB octets, mais cette limite peut
       être modifiée avec msgctl(2).) S’il n’y a pas assez de place, alors  le
       comportement  par  défaut  de  msgsnd()  est de bloquer jusqu’à obtenir
       suffisamment d’espace. En indiquant IPC_NOWAIT dans l’argument  msgflg,
       le message ne sera pas envoyé et l’appel système échouera en retournant
       EAGAIN dans errno.

       Un appel à msgsnd() bloqué peut échouer si :

       * la file est supprimée, auquel cas l’appel système échoue  avec  errno
         valant EIDRM ; ou

       * un  signal  a  été intercepté, auquel cas l’appel système échoue avec
         errno valant EINTR ; voir signal(7). (msgsnd() n’est  jamais  relancé
         automatiquement  après  interruption  par  un gestionnaire de signal,
         quelle que soit la configuration de SA_RESTART lors de l’installation
         du gestionnaire.)

       Si  l’appel système réussit, la structure décrivant la file de messages
       est mise à jour comme suit :

              msg_lspid contient le PID du processus appelant.

              msg_qnum est incrémenté de 1.

              msg_stime est rempli avec l’heure actuelle.

   msgrcv()
       L’appel système msgrcv() supprime un message depuis  la  file  indiquée
       par msqid et le place dans le tampon pointé par msgp.

       L’argument  msgsz  indique la taille maximale en octets du membre mtext
       de la structure pointée par l’argument msgp. Si le contenu  du  message
       est  plus  long que msgsz octets, le comportement dépend de la présence
       ou non de MSG_NOERROR dans msgflg. Si MSG_NOERROR est  spécifié,  alors
       le  message  sera  tronqué  (et  la  partie  tronquée sera perdue) ; si
       MSG_NOERROR n’est pas spécifié, le message ne sera pas  extrait  de  la
       file, et l’appel système échouera en renvoyant -1 et en indiquant E2BIG
       dans errno

       L’argument msgtyp indique le type de message désiré :

       * Si msgtyp vaut 0, le premier message est lu.

       * Si msgtyp est supérieur à 0, alors le premier message de type  msgtyp
         est  extrait  de la file. Si msgflg contient MSG_EXCEPT l’inverse est
         effectué, le premier message de type différent de msgtyp est  extrait
         de la file.

       * Si  msgtyp  est  inférieur à 0, le premier message de la file avec un
         type inférieur ou égal à la valeur absolue de msgtyp est extrait.

       L’argument msgflg est composé d’un OU binaire « | »  avec  les  options
       suivantes :

       IPC_NOWAIT
              Retourne  immédiatement  si  aucun  message du type désiré n’est
              présent dans la file. L’appel système échoue et errno est fixé à
              ENOMSG.

       MSG_EXCEPT
              Utilisé avec msgtyp supérieur à 0 pour lire les messages de type
              différent de msgtyp.

       MSG_NOERROR
              Tronque  silencieusement  les  messages  plus  longs  que  msgsz
              octets.

       Si  aucun  message  du  type  requis  n’est disponible et si on n’a pas
       demandé IPC_NOWAIT  dans  msgflg,  le  processus  appelant  est  bloqué
       jusqu’à l’occurrence d’un des événements suivants :

       * Un message du type désiré arrive dans la file.

       * La  file  de  messages est supprimée. L’appel système échoue et errno
         contient EIDRM.

       * Le processus appelant intercepte  un  signal.  Dans  ce  cas  l’appel
         système  échoue  avec  errno  valant  EINTR.  (msgrcv()  n’est jamais
         relancé automatiquement après interruption  par  un  gestionnaire  de
         signal,  quelle  que  soit  la  configuration  de  SA_RESTART lors de
         l’installation du gestionnaire.)

       Si l’appel système réussit, la structure décrivant la file de  messages
       est mise à jour comme suit :

              msg_lrpid est rempli avec le PID du processus appelant.

              msg_qnum est décrémenté de 1.

              msg_rtime est rempli avec l’heure actuelle.

VALEUR RENVOYÉE

       En  cas  d’échec les deux appels système renvoient -1 et errno contient
       le code d’erreur. Sinon msgsnd()  renvoie  0  et  msgrcv()  renvoie  le
       nombre d’octets copiés dans la table mtext.

ERREURS

       En cas d’échec de msgsnd(), errno aura l’une des valeurs suivantes :

       EACCES Le  processus appelant n’a pas de permissions d’écriture dans la
              file et n’a pas la capacité CAP_IPC_OWNER.

       EAGAIN Le message  n’a  pas  pu  être  envoyé  à  cause  de  la  limite
              msg_qbytes pour la file et de la requête IPC_NOWAIT dans msgflg.

       EFAULT msgp pointe en dehors de l’espace d’adressage accessible.

       EIDRM  La file de messages a été supprimée.

       EINTR  Un signal est arrivé avant d’avoir pu écrire quoi que ce soit.

       EINVAL msqid est invalide, ou bien mtype n’est  pas  positif,  ou  bien
              msgsz  est  invalide (négatif ou supérieur à la valeur MSGMAX du
              système).

       ENOMEM Le système n’a pas assez  de  mémoire  pour  copier  le  message
              pointé par msgp.

       En cas d’échec de msgrcv(), errno prend l’une des valeurs suivantes :

       E2BIG  Le  message  est plus long que msgsz, et MSG_NOERROR n’a pas été
              indiqué dans msgflg.

       EACCES Le processus appelant n’a pas de permission de lecture  dans  la
              file et n’a pas la capacité CAP_IPC_OWNER.

       EAGAIN Aucun  message  n’est disponible dans la file, et IPC_NOWAIT est
              spécifié dans msgflg.

       EFAULT msgp pointe en dehors de l’espace d’adressage accessible.

       EIDRM  La file de messages a  été  supprimée  alors  que  le  processus
              attendait un message.

       EINTR  Un  signal  est  arrivé avant d’avoir pu lire quoi que ce soit ;
              voir signal(7).

       EINVAL msgqid ou msgsz invalides.

       ENOMSG IPC_NOWAIT a été requis dans msgflg et  aucun  message  du  type
              réclamé n’existe dans la file.

CONFORMITÉ

       SVr4, POSIX.1-2001.

NOTES

       L’argument  msgp  est  déclaré  comme  un  struct  msgbuf  *  avec  les
       bibliothèques libc4, libc5, glibc 2.0, glibc 2.1. Il est déclaré  comme
       un   void   *  avec  la  bibliothèque  glibc  2.2,  suivant  ainsi  les
       spécifications SUSv2 et SUSv3.

       Les limites système concernant  les  files  de  messages  et  affectant
       msgsnd() sont :

       MSGMAX Taille  maximale  d’un  message : 8192 octets (sous Linux, cette
              limite  peut   être   lue   et   modifiée   grâce   au   fichier
              /proc/sys/kernel/msgmax).

       MSGMNB Taille  maximale,  en  octets,  d’une  file  de messages : 16384
              octets (sous Linux, elle peut être  lue  et  modifiée  grâce  au
              fichier   /proc/sys/kernel/msgmnb).   Le  superutilisateur  peut
              augmenter la taille d’une file de messages au-delà de MSGMNB  en
              utilisant l’appel système msgctl(2).

       L’implémentation  des  files  de  messages sous Linux n’a pas de limite
       intrinsèque pour le nombre maximal d’en‐têtes de messages  (MSGTQL)  et
       la  taille  maximale, en octets, de l’ensemble de tous les messages sur
       le système (MSGPOOL).

VOIR AUSSI

       msgctl(2), msgget(2), capabilities(7), mq_overview(7), svipc(7)

COLOPHON

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

TRADUCTION

       Cette  page  de  manuel  a  été  traduite et mise à jour par Christophe
       Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis  par
       Alain  Portal  <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
       disposition sur http://manpagesfr.free.fr/.

       Les mises à jour et corrections de la version présente dans Debian sont
       directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
       francophone de traduction de Debian.

       Veuillez  signaler  toute  erreur   de   traduction   en   écrivant   à
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

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