# 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