Next: Kernel ipc_perm structure Up: Internal and User Data Previous: Kernel msg structure

#### Kernel `msqid_ds` structure

Each of the three types of IPC objects has an internal data structure which is maintained by the kernel. For message queues, this is the `msqid_ds` structure. The kernel creates, stores, and maintains an instance of this structure for every message queue created on the system. It is defined in `linux/msg.h` as follows:

    /* one msqid structure for each queue on the system */
     struct msqid_ds {
         struct ipc_perm msg_perm;
         struct msg *msg_first;  /* first message on queue */
         struct msg *msg_last;   /* last message in queue */
         time_t msg_stime;       /* last msgsnd time */
         time_t msg_rtime;       /* last msgrcv time */
         time_t msg_ctime;       /* last change time */
         struct wait_queue *wwait;
         struct wait_queue *rwait;
         ushort msg_cbytes;
         ushort msg_qnum;
         ushort msg_qbytes;      /* max number of bytes on queue */
         ushort msg_lspid;       /* pid of last msgsnd */
         ushort msg_lrpid;       /* last receive pid */
     };

While you will rarely have to concern yourself with most of the members of this structure, a brief description of each is in order to complete our tour:

`msg_perm`

  An instance of the `ipc_perm` structure, which is defined for us in `linux/ipc.h`. This holds the permission information for the message queue, including the access permissions, and information about the creator of the queue (uid, etc).

`msg_first`

  Link to the first message in the queue (the head of the list).

`msg_last`

  Link to the last message in the queue (the tail of the list).

`msg_stime`

  Timestamp (`time_t`) of the last message that was sent to the queue.

`msg_rtime`

  Timestamp of the last message retrieved from the queue.

`msg_ctime`

  Timestamp of the last ``change'' made to the queue (more on this later).

`wwait`

  and

`rwait`

  Pointers into the kernel's wait queue. They are used when an operation on a message queue deems the process go into a sleep state (i.e. queue is full and the process is waiting for an opening).

`msg_cbytes`

  Total number of bytes residing on the queue (sum of the sizes of all messages).

`msg_qnum`

  Number of messages currently in the queue.

`msg_qbytes`

  Maximum number of bytes on the queue.

`msg_lspid`

  The PID of the process who sent the last message.

`msg_lrpid`

  The PID of the process who retrieved the last message.

Next: Kernel ipc_perm structure Up: Internal and User Data Previous: Kernel msg structure