next up previous contents
Next: Mémoire commune Up: Queues de message Previous: Queues de message   Contents

Implémentation

La fonction int msgget(key_t key,int msgflg ) permet de créer une queue de messages associée à la clef key_t key. Cette fonction renvoie l'identificateur de la queue de messages. Et msgflg est un indicateur permettant de spécifier les droits d'accès à la queue ainsi que le mode de création (IPC_CREAT - pour demander la création - IPC_EXCL - pour empêcher l'utilisation par un autre process).

[linewidth=1pt,fillstyle=solid,shadow=true](-0.5,0)(17.5,-10)

L'exemple suivant crée une queue de message associée à la clef $21_{(h)}$ ou récupère son identifiant s'il existe.


#include <sys/types.h> <sys/ipc.h> <sys/msg.h>

void main()
{
   ket_t key=0x21;

   int msqid,opperm=0777;

   if ((msqid=msgget(key,opperm | IPC_CREAT))==-1)
   {
      perror("mssget");
      exit(1);
   }

   printf("clef : %x   msqid : %d\n",key,msqid);
   exit(0);
}



La fonction int msgctl(int msqid,int cmd, struct msqid_ds *buf) permet la modification ou la récupération des informations de contrôle de la queue de message (numéro d'utilisateur et de groupe utilisant la queue, permissions et longueur maximum) :

[linewidth=1pt,fillstyle=solid,shadow=true](-0.5,0)(17.5,-13)

Dans l'exemple suivant, le programme permet d'afficher les paramètres d'une queue de messages dont l'identifiant est passé en paramètre.


#include <sys/types.h> <sys/ipc.h> <sys/msg.h> <stdio.h> <stdlib.h>

void main(int arc, char * argv[])
{
   extern int errno;
   int msqid;
   struct msqid_ds   buf;

   if (argc!=2)   perror("Nb d'arguments. incorrect");
   else           msqid=atoi(argv[1]);

   if (msgctl(msqid,IPC_CREAT,&buf)==-1)
   {
      perror("msgctl");
      exit(1);
   }
   printf("User ID : %d\n",buf->msg_perm.uid);
   printf("Groupe ID : %d\n",buf->msg_perm.gid);
   printf("Permissions : %d\n",buf->msg_perm.mode);
   printf("Longueur : %d\n",buf->msg_qbytes);
   printf("Nb de msg. : %d\n",buf->msg_qnum);
   exit(0);
}



La fonction int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg) envoie msgsz octets du message contenu dans la structure pointée par msgp dans la queue dont l'identifiant est msqid. msgflg précise le comportement de la fonction en cas d'impossibilité d'envoi :

Le programme suivant envoie un message constant et de type donné en paramètre dans la queue de messages (spécifiée en paramètre également).

NB : Notez la déclaration d'une structure msgb différente de la structure pré-déclarée msgbuff due à une spécification de longueur du membre msgbuf.mtext[1] non convenable (vérifier dans /usr/include/sys/msg.h)

[linewidth=1pt,fillstyle=solid,shadow=true](-0.5,0)(17.5,-13.5)


#include <sys/types.h> <sys/ipc.h> <sys/msg.h> 
#include <stdio.h> <stdlib.h> <string.h>

void main(int arc, char * argv[])
{
   int msqid;
   struct msgb {
                   long mtype;
                   char mtext[80];
               }   msgp;
   char *msg="Nul n'est jamais assez fort pour ce calcul";

   if (argc!=3)   perror("Nb d'arguments. incorrect");
   else           
   {
      msqid=atoi(argv[1]);
      msgp.mtype=atoi(argv[2]);
   }
   strcpy(msgp.mtext,msg);

   if(msgsnd(msqid,&msgp,strlen(msg),IPC_NOWAIT)==-1)
   {
      perror("msgsnd");
      exit(1);
   }
   exit(0);
}

La fonction int msgrcv( int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg ) est l'équivalent de la fonction msgsnd() pour la réception. Elle demande la récupération de msgsz octets d'un message de type msgtyp dans la queue de messages identifiée par msgid. Le message est stocké dans la structure pointée par msgp et retourne le nombre d'octets lus, si l'appel est réussi, ou -1 sinon.

msgflg précise le comportement de la fonction en cas d'impossibilité de lecture du message :

[linewidth=1pt,fillstyle=solid,shadow=true](-0.5,0)(17.5,-16)

Le programme suivant demande la lecture d'un message donné. Les caractéristiques du message sont passées en paramètres.


#include <sys/types.h> <sys/ipc.h> <sys/msg.h> 
#include <stdio.h> <stdlib.h> <string.h>

void main(int arc, char * argv[])
{
   int lg,msqid,rtn,flags;
   long mtype;
   struct msgb {
                   long mtype;
                   char mtext[80];
               }   msgp;

   if (argc!=4)   perror("Nb d'arguments. incorrect");
   else           
   {
      msqid=atoi(argv[1]);
      mtype=atoi(argv[2]);
      lg=atoi(argv[3]);
   }
   flags = IPC_NOWAIT | MSG_ERROR;

   if((rtn=msgrcv(msqid,&msgp,lg,mtype,flags))==-1)
   {
      perror("msgrcv");
      exit(1);
   }
   msgp.metxt[rtn]=0; /* fin de chaine */
   printf("%d caracteres : %s\n",rtn,msgp.mtext);
   exit(0);
}


next up previous contents
Next: Mémoire commune Up: Queues de message Previous: Queues de message   Contents
Arnaud Revel
2001-11-26