MSGOP
Section : Manuel du programmeur Linux (
2)
Mise à jour de la version anglaise : 2 février 2006
Index
Menu principal
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.
Index
- NOM
-
- SYNOPSIS
-
- DESCRIPTION
-
- msgsnd()
-
- msgrcv()
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- CONFORMITÉ
-
- NOTES
-
- VOIR AUSSI
-
- TRADUCTION
-
Dernière mise à jour : 17 juillet 2008