NOM¶
msgrcv, msgsnd - Opérations sur les files de messages System V
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 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.
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.
À moins que
MSG_COPY ne soit indiqué dans
msgflg
(voir ci-dessous), 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 attributs suivants.
- IPC_NOWAIT
- 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 errno est configuré à
ENOMSG.
- MSG_COPY (depuis Linux 3.8)
- Récupérer une copie de façon non destructive du
message dans la file à la position ordinale indiquée par
msgtyp (les messages sont considérées
numérotés à partir de 0).
Cet attribut doit être indiqué en conjonction avec
IPC_NOWAIT, de telle sorte que si aucun message n’est
disponible à la position donnée, l’appel
échoue immédiatement avec l’erreur ENOMSG.
Parce qu'ils modifient le sens de msgtyp de manière
opposée, MSG_COPY et MSG_EXCEPT ne peuvent
être définis simultanément dans msgflg.
L'attribut MSG_COPY a été ajouté pour
l’implémentation de point de restauration du noyau et
n’est disponible que si le noyau a été compilé
avec l’option CONFIG_CHECKPOINT_RESTORE.
- MSG_EXCEPT
- Utilisé avec msgtyp supérieur à 0 pour lire
les messages de type différent de msgtyp.
- MSG_NOERROR
- Tronquer 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.
- EINVAL (depuis Linux 3.14)
- msgflg définit MSG_COPY sans définir
IPC_NOWAIT.
- EINVAL (depuis Linux 3.14)
- msgflg définit à la fois MSG_COPY et
MSG_EXCEPT.
- ENOMSG
- IPC_NOWAIT a été indiqué dans msgflg et
aucun message du type réclamé n'existe dans la file.
- ENOMSG
- IPC_NOWAIT et MSG_COPY ont été indiqués
dans msgflg et la file contient moins de msgtyp
messages.
- ENOSYS (depuis Linux 3.8)
- MSG_COPY a été indiqué dans msgflg et
le noyau a été configuré sans
CONFIG_CHECKPOINT_RESTORE.
SVr4, POSIX.1-2001.
Les attributs
MSG_EXCEPT et
MSG_COPY sont spécifiques
à Linux. Leur définition peut être obtenue en
définissant la macro de test de fonctionnalités
_GNU_SOURCE.
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 suivantes concernent les files de messages et affectent
l’appel
msgsnd().
- 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).
BOGUES¶
Jusqu'à la version Linux 3.13, si
msgrcv() était
appelé avec l’attribut
MSG_COPY, mais sans
IPC_NOWAIT, et que la file de messages contenait moins de
msgtyp
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,
quelle que soit la
position ordinale
msgtyp de ce message. Ce bogue est corrigé
depuis Linux 3.14.
Indiquer à la fois
MSG_COPY et
MSC_EXCEPT dans
msgflg est une erreur de logique (puisque ces attributs imposent des
interprétations différentes de
msgtyp). Jusqu'à
Linux 3.13, cette erreur n’était pas diagnostiquée
par
msgsrv(). Ce bogue est corrigé depuis Linux 3.14.
VOIR AUSSI¶
msgctl(2),
msgget(2),
capabilities(7),
mq_overview(7),
svipc(7)
COLOPHON¶
Cette page fait partie de la publication 3.65 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> ».