next up previous
Next: Função msgrcv() Up: As Filas de Mensagens Previous: Função msgctl()

Função msgsnd()

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

  int  msgsnd ( int msqid, struct msgbuf *msgp, int msgsz,
                int msgflg )

Valor de retorno: 0 se a mensagem é colocada na fila e -1 em caso de erro.

A função msgsnd permite a inserção de uma mensagem na fila. A estrutura da mensagem é limitada de duas maneiras: primeiramente, ela deve ser menor que o limite estabelecido pelo sistema; depois, ela deve respeitar o tipo de dado estabelecido pela função que receberá a mensagem. Esta função recebe três parâmetros em sua chamada: o identificador da fila msqid; um ponteiro msgp para a estrutura de tipo msgbuf que contem a mensagem a ser enviada; um inteiro msg_sz indicando o tamanho em bytes da mensagem apontada por msgbuf e; un flag msgflg que controla o modo de envio da mensagem.

Em relação ao valor do flag msgflg, ele poderá ser utilizado da seguinte forma:

A função msgsnd atualiza também a estrutura msqid_ds:

A estrutura msgbuf

A estrutura msgbuf descreve a estrutura da mensagem propriamente dita. Ela é definida em <sys/msg.h> da seguinte maneira:

/* Template for struct to be used as argument for 
 * `msgsnd' and `msgrcv'.  */
struct msgbuf
  {
    long int mtype;     /* type of received/sent message */
    char mtext[1];      /* text of the message */
  };

mtype é um inteiro longo positivo, o qual é usado para definir o tipo de mensagem na função de recepção. Uma boa regra de programação quando filas de mensagens são utilizadas, é definir mtype logo no início da estrutura que define a mensagem. Uma vez que mtype é usado para recepção, ela deve não só ser imperativamente declarada na sua estrutura, como também, ela deve conter um valor conhecido.

mtext é a mensagem a ser efetivamente enviada (array de bytes).

Estranhamente, a estrutura definida em IPC é definida para mensagens de tamanho igual a apenas 1 byte. Para contornar esse problema, costuma-se definir uma estrutura para envio de mensagens para uma fila da seguinte forma:

#define MSG_SIZE_TEXT 256 
struct msgtext 
 { 
    long mtype ;                 /* type da mensagem */ 
    char mtexte[MSG_SIZE_TEXT] ; /* texto du mensagem */;
 }

Segundo as necessidades do programador, o tamanho máximo das mensagens podem ser reguladas através do parâmetro MSG_SIZE_TEXT. Observe que o campo mtype está localizado no início da estrutura.

Exemplo:

Exemplo de utilização da função msgsnd:

                    /* arquivo test_msgsnd.c */
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>

#define KEY 123
#define MSG_SIZE_TEXT 256

int main()
{
int i = 1 ;
int msqid ; 
char *path = "nome_de_arquivo_existente" ;

/* estrutura msg associada as mensagens */
struct msgtext {
     long mtype ;
     char mtext[MSG_SIZE_TEXT] ;
} msg ;         

   /* recuperacao do identificador da fila de mensagens */
   if (( msqid = msgget(ftok(path,(key_t)KEY),0)) == -1 ) {
          perror ("Erro msgget()") ;
          exit(1) ;
   }
   printf("A chave %#x esta associada a fila %d\n",
           ftok(path,(key_t)KEY), msqid);
   msg.mtype = 1 ;           /* tipo das mensagens */
   while(i<=30)  
   {
       /* escreve o texto da mensagem */
       sprintf(msg.mtext,"mensagem no %d de tipo %ld",i,msg.mtype) ;
       /* envia a mensagem a fila */
       if(msgsnd(msqid,&msg,strlen(msg.mtext),IPC_NOWAIT) == -1)
       {
             perror("Envio de mensagem impossivel") ;
             exit(-1) ;
       }
       printf("mensagem no %d de tipo %ld enviada a fila %d\n",
               i,msg.mtype,msqid) ;
       printf("-->texto da mensagem: %s\n",msg.mtext) ;
       i++ ;
     } 
     exit(0);
}

Resultado da execução:

euler:~/> test_msgsnd 
A chave 0x7b045862 esta associada a fila 1152
mensagem no 1 de tipo 1 enviada a fila 1152
-->texto da mensagem: mensagem no 1 de tipo 1
mensagem no 2 de tipo 1 enviada a fila 1152
-->texto da mensagem: mensagem no 2 de tipo 1

...

mensagem no 29 de tipo 1 enviada a fila 1152
-->texto da mensagem: mensagem no 29 de tipo 1
mensagem no 30 de tipo 1 enviada a fila 1152
-->texto da mensagem: mensagem no 30 de tipo 1

O estado atual da fila pode ser consultado através da execução do programa test_msgctl:

euler:~/> test_msgctl

A chave 0x7b045862 esta associada a fila 1152
id da fila de mensagens      : 1152
id do proprietario           : 1145
id do grupo do proprietario  : 1000
id do criador                : 1145
id do grupo do criador       : 1000
direitos de acesso           : 384
nb atual de bytes na fila    : 711
nb de mensagens na fila      : 30
nb maximal de bytes na fila  : 16384
pid do ultimo escritor       : 2192
pid do ultimo leitor         : 2190
data da ultima escrita       : Tue Oct 17 06:53:54 2000

data da ultima leitura       : Tue Oct 17 06:50:21 2000

data da ultima modificacao   : Tue Oct 17 06:43:09 2000


next up previous
Next: Função msgrcv() Up: As Filas de Mensagens Previous: Função msgctl()
Celso Alberto Saibel Santos 2000-11-14