MSGOP(2)

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);

DESCRIPTION
Les appels système msgsnd() et msgrcv() servent respectivement à envoyer et recevoir des messages dans une file d'attente de messages. Le processus appelant doit avoir la permission d'écriture sur la file pour envoyer un message et la permission de lecture pour en recevoir.

L'argument msgp est un pointeur vers une structure, définie par l'appelant, dont la forme est la suivante :
struct msgbuf {
    long  mtype;    /* type de message ( doit être > 0 ) */
    char  mtext[1]; /* contenu du message */
};

Le champ mtext est un tableau (ou une autre structure) de taille msgsz, valeur entière non négative. Les message de taille nulle (sans champ msgsz) sont autorisés. Le membre mtype doit avoir une valeur strictement positive. Cette valeur peut être utilisée par le processus lecteur pour la sélection de messages (voir la description de msgrcv() plus loin).

  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 msgflg, le message ne sera pas envoyé et l'appel système échouera en retournant EAGAIN dans errno. Un appel à msgsnd() bloqué peut également échouer si :

*   la file est supprimée, auquel cas l'appel système échouera en retournant EIDRM dans errno ; ou

*   un signal a été intercepté, auquel cas l'appel système échouera en retournant EINTR dans errno ; 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 de la file de messages sera mise à jour ainsi :

    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
    Revient immédiatement si aucun message du type désiré n'est présent. L'appel système échoue et errno est renseignée avec 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 trop longs

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 reçoit un signal à intercepter. L'appel système échoue et errno est renseignée avec EINTR. (msgrcv() n'est jamais automatiquement relancé après avoir été interrompu 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 est renseignée en conséquence. Sinon msgsnd() renvoie 0 et msgrcv() renvoie le nombre d'octets copiés dans la table mtext.

ERREURS
Lorsque msgsnd() échoue, errno est renseignée avec 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 ; voir signal(7).

EINVAL
    La valeur de msqid est invalide ou la valeur de mtype n'est pas positive ou la valeur de msgsz est invalide (plus petite que 0 ou plus grande que la valeur système MSGMAX).

ENOMEM
    Le système n'a pas assez de mémoire pour créer une copie du message pointé par msgp.

Lorsque msgrcv() échoue, errno est renseignée avec 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 était indiqué 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.

EINVAL
    msgqid est invalide ou msgsz est inférieur à 0.

ENOMSG
    IPC_NOWAIT a été indiqué 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 et ultérieures, suivant ainsi les spécifications SUSv2 et SUSv3. Les limites systèmes suivantes influent sur msgsnd() :

MSGMAX
    Taille maximum d'un message : 8192 octets. (Sous Linux, cette limite peut être lue et modifiée via /proc/sys/kernel/msgmax).

MSGMNB
    Taille maximale d'une file de messages : 16384 octets (Sous Linux, cette limite peut être lue et modifiée via /proc/sys/kernel/msgmnb). Le superutilisateur peut augmenter la taille d'une file de messages au-delà de MSGMNB avec 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'entêtes de messages (MSGTQL) et la taille maximale de l'ensemble de l'ensemble de tous les messages (MSGPOOL).

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

TRADUCTION

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 14 octobre 1996 et révisée le 17 juillet 2008.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 msgop ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.