# 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