msgop, msgrcv, msgsnd - Opérations sur les messages.
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. Les message de taille nulle (sans champ
msgsz)
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 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.
S'il y a assez de place dans la file,
msgsnd
réussit immédiatement.
(La capacité de la filer est définie par le champ
msg_bytes
de la structure associée à la file de message. Durant la création de la file
de champ est initialisé à
MSGMNB
octets, mais cette limite peut être modifiée avec
msgctl).
S'il n'y a pas assez de place, alors le comportement par défaut de
msgsnd
est de bloquer jusqu'à obtenir suffisament d'espace.
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 condition 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).
(
msgsnd et
msgrcv)
ne sont jamais relancés automatiquement après interruption par un
gestionnaire de signal, quelque soit la configuration de
SA_RESTART
lors de l'installation du gestionnaire).
Si l'appel réussit, la structure de 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.
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 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
Si aucun message du type désiré 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 échoue et
errno
contient
EIDRM.
-
Le processus appelant reçoit un signal à intercepter.
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.
SVr4, SVID.
Christophe Blaess, 1996-2003.