# include <sys/types.h> # include <sys/ipc.h> # include <sys/msg.h> int msgctl ( int msqid, int cmd, struct msqid_ds *buf )
Valor de retorno: 0 em caso de sucesso e -1 em caso de erro.
A função msgctl() é utilizada para examinar e modificar os atributos de uma fila de mensagens existente. Ela recebe três parâmetros: um identificador da fila de mensagens (msqid); um comando a ser efetuado sobre a fila (command) e; um ponteiro para uma estrutura do tipo msqid_ds (buf).
O parâmetro command pode conter os seguintes valores e ações associadas:
Exemplo:
Neste exemplo, supõe-se que o segmento de memória compartilhada de chave 123 foi criado anteriormente por um processo.
/* arquivo test_msgctl.c */
/*
* o programa recupera o ID de uma fila existente (criada com o
* programa test_msgget.c e mostra a estrutura msqid_ds
* associada a essa fila
*/
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <time.h>
#define KEY 123
int main()
{
struct msqid_ds buf ;
char *path = "nome_de_arquivo_existente" ;
int msqid ;
/* recuperacao do ID da fila de mensagens associada a chave 123 */
if (( msqid = msgget(ftok(path,(key_t)KEY),0)) == -1 ) {
perror ("Erreur msgget()") ;
exit(1) ;
}
printf("A chave %#x esta associada a fila %d\n",
ftok(path,(key_t)KEY), msqid);
/* recuperacao na estrutura buf dos parametros da fila */
if (msgctl(msqid,IPC_STAT,&buf) == -1){
perror("Erreur msgctl()") ;
exit(1) ;
}
else
{
printf("id da fila de mensagens : %d\n",msqid) ;
printf("id do proprietario : %d\n",buf.msg_perm.uid) ;
printf("id do grupo do proprietario : %d\n",buf.msg_perm.gid) ;
printf("id do criador : %d\n",buf.msg_perm.cuid) ;
printf("id do grupo do criador : %d\n",buf.msg_perm.cgid) ;
printf("direitos de acesso : %d\n",buf.msg_perm.mode) ;
printf("nb atual de bytes na fila : %d\n",buf.msg_cbytes) ;
printf("nb de mensagens na fila : %d\n",buf.msg_qnum) ;
printf("nb maximal de bytes na fila : %d\n",buf.msg_qbytes) ;
printf("pid do ultimo escritor : %d\n",buf.msg_lspid) ;
printf("pid do ultimo leitor : %d\n",buf.msg_lrpid) ;
printf("data da ultima escrita : %s\n",ctime(&buf.msg_stime)) ;
printf("data da ultima leitura : %s\n",ctime(&buf.msg_rtime)) ;
printf("data da ultima modificacao : %s\n",ctime(&buf.msg_ctime)) ;
}
exit(0);
}
Resultado da execução:
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 : 0 nb de mensagens na fila : 0 nb maximal de bytes na fila : 16384 pid do ultimo escritor : 0 pid do ultimo leitor : 0 data da ultima escrita : Wed Dec 31 21:00:00 1969 data da ultima leitura : Wed Dec 31 21:00:00 1969 data da ultima modificacao : Tue Oct 17 06:43:09 2000