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> ».