# 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