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 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_qbytes 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 ; consultez 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 configuré à 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 ; consultez 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.
SVr4, POSIX.1-2001.
NOTES¶
L'inclusion de
<sys/types.h> et
<sys/ipc.h> 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.
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.44 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¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Christophe Blaess <
http://www.blaess.fr/christophe/> (1996-2003), Alain
Portal <
http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et
l'équipe francophone de traduction de Debian (2006-2009).
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> ».