zion -  msgop


Nom

msgop, msgrcv, msgsnd - Opérations sur les messages.

Résumé

.nf .B #include <sys/types.h> .B #include <sys/ipc.h> .B #include <sys/msg.h> .fi int msgsnd (int msqid , struct msgbuf * msgp , size_t msgsz , int msgflg ); ssize msgrcv (int msqid , struct msgbuf * msgp , size_t msgsz , long msgtyp , int msgflg );

Description

Pour envoyer ou recevoir un message, le processus appelant alloue une structure comme celle-ci : .nf struct msgbuf { long mtype; /* type de message ( > 0 ) */ char mtext[1]; /* contenu du message */ }; .fi 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.


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é 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 é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 réclamé 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 octets.

MSGMNB
    Taille maximale d'une file de messages. Peut être augmentée par le Super-User.


Conformité

SVr4, SVID.

Notes

L'argument pointeur 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 * (const void * pour msgsnd()) avec la bibliothèque glibc 2.2, suivant ainsi les spécifications SUSv2.

Voir aussi

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

Traduction

Christophe Blaess, 1996-2003.

Poster un commentaire
Utilisateur
Mot de passe
 
Informaticien.be - © 2002-2024 AkretioSPRL  - Generated via Kelare
The Akretio Network: Akretio - Freedelity - KelCommerce - Votre publicité sur informaticien.be ?