next up previous
Next: Função msgsnd() Up: As Filas de Mensagens Previous: Como criar uma fila

Função msgctl()

 
   # 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


next up previous
Next: Função msgsnd() Up: As Filas de Mensagens Previous: Como criar uma fila
Celso Alberto Saibel Santos 2000-11-14