MSGOP(2) Manuel du programmeur Linux MSGOP(2)
NOM
msgop, msgrcv, msgsnd - Opérations sur les messages.
SYNOPSIS
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>
int msgsnd (int msqid, struct msgbuf * msgp, int msgsz, int msgflg)
int msgrcv (int msqid, struct msgbuf * msgp, int msgsz, long msgtyp, int msgflg)
DESCRIPTION
Pour envoyer ou recevoir un message, le processus appelant
alloue une structure comme celle-ci :
struct msgbuf {
long mtype; /* type de message ( > 0 ) */
char mtext[1]; /* contenu du message */
};
avec une table mtext de taille msgsz, valeur entière non-
négative.
Le membre mtype doit avoir une valeur strictement positive
qui puisse etre utilisée par le processus lecteur pour la
sélection de messages (voir plus bas).
Le processus doit avoir une permission d'écriture sur la
file pour envoyer un message, et une permission de lecture
pour en recevoir un.
L'appel système msgsnd insère une copie du message pointé
par l'argument msgp dans la file dont l'identificateur est
indiqué par la valeur de l'argument msqid.
L'argument msgflg précise le comportement de l'appel
système si l'insertion du nouveau message nécessite plus
de msg_qbytes dans la file. En indiquant IPC_NOWAIT le
message ne sera pas envoyé et l'appel système échouera en
retournant EAGAIN dans errno.
Sinon, le processus sera suspendu jusqu'à ce que la condi
tion de blocage soit levée (auquel cas le message sera
envoyé et l'appel système réussira), ou que la file soit
supprimée (auquel cas l'appel système échouera et errno
contiendra EIDRM), ou que le processus reçoive un signal à
intercepter (auquel cas l'appel système échouera et errno
contiendra EINTR).
Si l'appel réussit, la structure de file de messages sera
mise à jour ainsi :
Linux 19 Juillet 1997 1
MSGOP(2) Manuel du programmeur Linux MSGOP(2)
msg_lspid contient le PID du processus appelant.
msg_qnum est incrémenté de 1.
msg_stime est rempli avec l'heure actuelle.
l'appel système msgrcv lit un message depuis la file
indiquée par msqid dans la structure msgbuf pointée par
l'argument msgp, en extrayant le message en cas de
réussite.
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,
et si l'argument msgflg contient MSG_NOERROR, alors le
message sera tronqué (et la partie tronquée sera perdue).
Sinon le message ne sera pas extrait de la file, et
l'appel système échouera 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 mes
sage 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 Si aucun message du type desiré n'est
présent, 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
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
Linux 19 Juillet 1997 2
MSGOP(2) Manuel du programmeur Linux MSGOP(2)
échoue et errno contient EIDRM.
Le processus appelant reçoit un signal à inter
cepter. L'appel système échoue et errno contient
EINTR.
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èmes renvoient -1 et
errno contient le code d'erreur. Sinon msgsnd renvoie 0
et msgrvc renvoie le nombre d'octets copiés dans la table
mtext.
ERREURS
msgsnd :
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 mgsflg.
EACCES le processus appelant n'a pas de permissions de
lecture dans la file.
EFAULT msgp pointe en dehors de l'espace d'adressage
accessible.
EIDRM La file de message a été supprimée
EINTR Un signal est arrivé avant d'avoir pu écrire
quoi que ce soit.
EINVAL msqid ou mtype ou msgsz sont invalides.
ENOMEM pas assez de mémoire pour le noyau.
msgrcv :
E2BIG message trop long, et MSG_NOERROR n'a pas été req
uis.
EACCES Le processus appelant n'a pas de permission de lec
ture dans la file.
EFAULT msgp pointe en dehors de l'espace d'adressage
accessible.
Linux 19 Juillet 1997 3
MSGOP(2) Manuel du programmeur Linux MSGOP(2)
EIDRM La file de messages a été supprimée.
EINTR Un signal est arrivé avant d'avoir pu lire quoi que
ce soit.
EINVAL msgqid ou msgsz invalides.
ENOMSG IPC_NOWAIT a été requis et aucun message du type
reclamé n'existe dans la file.
NOTES
Les limites systèmes suivantes influent sur msgsnd :
MSGMAX Taille maximum d'un message : l'implémentation
Linux 0.99.13 fixe cette limite à 4080 bytes.
MSGMNB Taille maximale d'une file de messages. Peut
être augmentée par le Super-User.
CONFORMITÉ
SVr4, SVID.
VOIR AUSSI
ipc(5), msgctl(2), msgget(2), msgrcv(2), msgsnd(2).
TRADUCTION
Christophe Blaess, 1997.
Linux 19 Juillet 1997 4