Name

msgctl - message control operations

Library

libc.lib

Synopsis

  #include <sys/types.h>
  #include <sys/ipc.h>
  #include <sys/msg.h>
  int msgctl (int msqid, int cmd, struct msqid_ds *buf);

Return values

The msgctl function returns the value 0 if successful; otherwise the value -1 is returned and errno is set to indicate the error.

Detailed description

The msgctl system call performs some control operations on the message queue specified by msqid.

Each message queue has a data structure associated with it, parts of which may be altered by msgctl and parts of which determine the actions of msgctl. The data structure is defined in <sys/msg.h> and contains (amongst others) the following members:

struct msqid_ds {
        struct  ipc_perm msg_perm;      /* msg queue permission bits */
        struct  msg *msg_first; /* first message in the queue */
        struct  msg *msg_last;  /* last message in the queue */
        u_long  msg_cbytes;     /* number of bytes in use on the queue */
        u_long  msg_qnum;       /* number of msgs in the queue */
        u_long  msg_qbytes;     /* max # of bytes on the queue */
        pid_t   msg_lspid;      /* pid of last msgsnd() */
        pid_t   msg_lrpid;      /* pid of last msgrcv() */
        time_t  msg_stime;      /* time of last msgsnd() */
        long    msg_pad1;
        time_t  msg_rtime;      /* time of last msgrcv() */
        long    msg_pad2;
        time_t  msg_ctime;      /* time of last msgctl() */
        long    msg_pad3;
        long    msg_pad4[4];
};

         

The ipc_perm structure used inside the shmid_ds structure is defined in <sys/ipc.h> and looks like this:

struct ipc_perm {
        ushort  cuid;   /* creator user id */
        ushort  cgid;   /* creator group id */
        ushort  uid;    /* user id */
        ushort  gid;    /* group id */
        ushort  mode;   /* r/w permission */
        ushort  seq;    /* sequence # (to generate unique msg/sem/shm id) */
        key_t   key;    /* user specified msg/sem/shm key */
};

         

The operation to be performed by msgctl is specified in cmd and is one of:

IPC_STAT Gather information about the message queue and place it in the structure pointed to by buf.
IPC_SET Set the value of the msg_perm.uid, msg_perm.gid, msg_perm.mode and msg_qbytes fields in the structure associated with msqid. The values are taken from the corresponding fields in the structure pointed to by buf. Values for msg_qbytes that exceed the system limit (MSGMNB from <sys/msg.h>) are silently truncated to that limit.
IPC_RMID Remove the message queue specified by msqid and destroy the data associated with it.

The permission to read from or write to a message queue (see msgsnd and msgrcv is determined by the msg_perm.mode field in the same way as is done with files (see chmod)


Examples

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

         
#define MESSAGE_Q_KEY 1000

         
int main(void)
{
   int msq_id, len;
   struct {
       long mtype;
       char mtext[128];
   } msg_buf;
   /*
    * Create a message queue with a given key
    */
    if ((msq_id = msgget(MESSAGE_Q_KEY, IPC_CREAT | IPC_EXCL | 0666)) == -1) {
       printf("Message Q create failed with errno %d\n", errno);
       return -1;
    }
    msg_buf.mtype = 1; /* message identifier */
    strcpy(msg_buf.mtext, "some_data_to_send"); /* data */
    len = strlen(msg_buf.mtext)+1;
    /*
     * Put the message in the queue
     */
    if (msgsnd(msq_id, (struct msgbuf *)&msg_buf, len, 0) == -1) {
        printf("Message Q send failed with errno %d\n", errno);
    }
    return 0;
}

         

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

         
#define MESSAGE_Q_KEY 1000

         
int main(void)
{
   int msq_id;
   int msg_len = 128;
   int msg_type = 0; /* Any type of message */
   struct {
       long mtype;
       char mtext[128];
   } msg_buf;
   /*
    * Get the message queue id for the given key
    */
    if ((msq_id = msgget(MESSAGE_Q_KEY, 0)) == -1) {
       printf("Message Q  get id failed with errno %d\n", errno);
       return -1;
    }
    /*
     * Get the message from the queue
     */
    if (msgrcv(msq_id, (struct msgbuf *)&msg_buf, msg_len, msg_type, 0) == -1) {
        printf("Message Q recv failed with errno %d\n", errno);
    }
    /*
     * Remove the message queue
     */
     if (msgctl(msq_id, IPC_RMID, NULL) == -1) {
       printf("Message Q  delete failed with errno %d\n", errno);
       return -1;
     }
     return 0;
}

         


Errors

The msgctl function will fail if:
[EPERM]
  The cmd argument is equal to IPC_SET or IPC_RMID and the caller does not have the permission to perform this operation

An attempt is made to increase the value of msg_qbytes through IPC_SET but the caller does not have the permission to perform this operation.

[EACCES]
  The command is IPC_STAT and the caller has no read permission for this message queue.
[EINVAL]
  The msqid argument is not a valid message queue identifier.

cmd is not a valid command.


See also

msgget, msgrcv, msgsnd

Feedback

For additional information or queries on this page send feedback

© 2005-2007 Nokia

Top