MSGOP(2)

NOM
msgop, msgrcv, msgsnd - Operations 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 entiere non-negative. Le membre mtype doit avoir une valeur strictement positive qui puisse etre utilisee par le processus lecteur pour la selection de messages (voir plus bas).

Le processus doit avoir une permission d'ecriture sur la file pour envoyer un message, et une permission de lecture pour en recevoir un.

L'appel systeme msgsnd insere une copie du message pointe par l'argument msgp dans la file dont l'identificateur est indique par la valeur de l'argument msqid.

L'argument msgflg precise le comportement de l'appel systeme si l'insertion du nouveau message necessite plus de msg_qbytes dans la file. En indiquant IPC_NOWAIT le message ne sera pas envoye et l'appel systeme echouera en retournant EAGAIN dans errno. Sinon, le processus sera suspendu jusqu'a ce que la condition de blocage soit levee (auquel cas le message sera envoye et l'appel systeme reussira), ou que la file soit supprimee (auquel cas l'appel systeme echouera et errno contiendra EIDRM), ou que le processus recoive un signal a intercepter (auquel cas l'appel systeme echouera et errno contiendra EINTR).

Si l'appel reussit, la structure de file de messages sera mise a jour ainsi :

    msg_lspid contient le PID du processus appelant.

    msg_qnum est incremente de 1.

    msg_stime est rempli avec l'heure actuelle.

l'appel systeme msgrcv lit un message depuis la file indiquee par msqid dans la structure msgbuf pointee par l'argument msgp, en extrayant le message en cas de reussite.

L'argument msgsz indique la taille maximale en octets du membre mtext de la structure pointee 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 tronque (et la partie tronquee sera perdue). Sinon le message ne sera pas extrait de la file, et l'appel systeme echouera en indiquant E2BIG dans errno

L'argument msgtyp indique le type de message desire :

    Si msgtyp vaut 0, le premier message est lu.

    Si msgtyp est superieur a 0, alors le premier message de type msgtyp est extrait de la file. Si msgflg contient MSG_EXCEPT l'inverse est effectue, le premier message de type different de msgtyp est extrait de la file.

    Si msgtyp est inferieur a 0, le premier message de la file avec un type inferieur ou egal a la valeur absolue de msgtyp est extrait.

L'argument msgflg est compose d'un OU binaire ( | ) avec les options suivantes :

    IPC_NOWAIT Si aucun message du type desire n'est present, l'appel systeme echoue et errno est fixe a ENOMSG.

    MSG_EXCEPT Utilise avec msgtyp superieur a 0 pour lire les messages de type different 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 demande IPC_NOWAIT dans msgflg, Le processus appelant est bloque jusqu'a l'occurrence d'un des evenements suivants.

    Un message du type desire arrive dans la file.

    La file de messages est supprimee. L'appel systeme echoue et errno contient EIDRM.

    Le processus appelant recoit un signal a intercepter. L'appel systeme echoue et errno contient EINTR.

Si l'appel systeme reussit, la structure decrivant la file de messages est mise a jour comme suit :

    msg_lrpid est rempli avec le PID du processus appelant.

    msg_qnum est decremente de 1

    msg_rtime est rempli avec l'heure actuelle.

VALEUR RENVOYEE
En cas d'echec les deux appels systemes renvoient -1 et errno contient le code d'erreur. Sinon msgsnd renvoie 0 et msgrvc renvoie le nombre d'octets copies dans la table mtext.

ERREURS
msgsnd :

EAGAIN
    Le message n'a pas pu etre envoye a cause de la limite msg_qbytes pour la file et de la requete 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 ete supprimee

EINTR
    Un signal est arrive avant d'avoir pu ecrire quoi que ce soit.

EINVAL
    msqid ou mtype ou msgsz sont invalides.

ENOMEM
    pas assez de memoire pour le noyau.

msgrcv :

E2BIG
    message trop long, et MSG_NOERROR n'a pas ete requis.

EACCES
    Le processus appelant n'a pas de permission de lecture dans la file.

EFAULT
    msgp pointe en dehors de l'espace d'adressage accessible.

EIDRM
    La file de messages a ete supprimee.

EINTR
    Un signal est arrive avant d'avoir pu lire quoi que ce soit.

EINVAL
    msgqid ou msgsz invalides.

ENOMSG
    IPC_NOWAIT a ete requis et aucun message du type reclame n'existe dans la file.

NOTES
Les limites systemes suivantes influent sur msgsnd :

MSGMAX
    Taille maximum d'un message : l'implementation Linux 0.99.13 fixe cette limite a 4080 bytes.

MSGMNB
    Taille maximale d'une file de messages. Peut etre augmentee par le Super-User.

CONFORMITE
SVr4, SVID.

VOIR AUSSI
ipc(5), msgctl(2), msgget(2), msgrcv(2), msgsnd(2).