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 */ };
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).
Link to the first message in the queue (the head of the list).
Link to the last message in the queue (the tail of the list).
Timestamp (time_t) of the last message that was sent to the queue.
Timestamp of the last message retrieved from the queue.
Timestamp of the last ``change'' made to the queue (more on this later).
and
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).
Total number of bytes residing on the queue (sum of the sizes of all messages).
Number of messages currently in the queue.
Maximum number of bytes on the queue.
The PID of the process who sent the last message.
The PID of the process who retrieved the last message.