上周因课题的需要,写了一个进程间使用消息队列通信的程序。之所以,用因为消息队列是随内核存在的,即使进程退出它仍然存在 。消息队列的这种特点正适合我的需要。下面是来自CSDN博客上的一篇文章,转自http://blog.csdn.net/liranke/archive/2010/05/19/5608686.aspx
1. 基本概念
消息队列的最佳定义是:内核地址空间中的内部链表。消息可以顺序地发送到队列中,
并以几种不同的方式从队列中获取。当然,每个消息队列都是由 IPC 标识符所唯一标识的。
2. 内部和用户数据结构
要完成理解象系统 V IPC 这样复杂的问题,关键是要彻底熟悉内核的几个内部数据结构。
甚至对那些最基本的操作来说,直接访问这些结构中的某几个结构也是必要的,而其他的结
构则停留在一个更低的级别上。
3. 消息缓冲区
我们要介绍的第一个结构是 msgbuf 结构。这个特殊的数据结构可以认为是消息数据的模
板。虽然定义这种类型的数据结构是程序员的职责,但是读者绝对必须知道实际上存在
msgbuf 类型的结构。它是在在 linux/msg.h 中定义的,有 2 个成员:
• mtype — 它是消息类型,以正数来表示。这个数必须为一个正数!
• mtext — 它就是消息数据。
4. 内核 msg 结构
内核把消息队列中的每个消息都存放在 msg 结构的框架中。该结构是在 linux/msg.h 中定义
的,如下是其成员的描述:
• msg_next — 这是一个指针,指向消息队列中的下一个消息。在内核寻址空间中,它们
是当作一个链表存储的。
• msg_type — 这是消息类型,它的值是在用户结构 msgbuf 中赋予的。
• msg_spot — 这是一个指针,指向消息体的开始处。
• msg_ts — 这是消息文本 ( 消息体 ) 的长度。
• 内核 msgid_ds 结构 — IPC 对象分为三类,每一类都有一个内部数据结构,该数据结构
是由内核维护的。对于消息队列而言,它的内部数据结构是 msqid_ds 结构。对于系统上
创建的每个消息队列,内核均为其创建、存储和维护该结构的一个实例。该结构在
linux/msg.h 中定义,如下所示:
struct msqid_ds{
struct ipc_perm msg_perm;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
...
...
};
在不同的系统中,此结构会有不同的新成员,这里只列出最少拥有的关键成员。其中, msg_qbytes 成员以及 msg_qnum 成员在不同的系统也会有不同的上限值,这里就不逐一介绍了,详细内容请参阅相关系统手册。
• msg_perm — 它是 ipc_perm 结构的一个实例, ipc_perm 结构是在 linux/ipc.h 中定义的。
该成员存放的是消息队列的许可权限信息,其中包括访问许可信息,以及队列的创建者
的有关信息 ( 如 uid 等等 ) 。
• msg_first — 链接到队列中的第一个消息 ( 列表头部 ) 。
• msg_last — 链接到队列中的最后一个消息 ( 列表尾部 ) 。
• msg_stime — 发送到队列的最后一个消息的时间戳 (time_t) 。
• msg_rtime — 从队列中获取的最后一个消息的时间戳。
• msg_ctime — 对队列进行最后一次变动的时间戳。
5. 内核 ipc_perm 结构
内核把 IPC 对象的许可权限信息存放在 ipc_perm 类型的结构中。例如在前面描述的某个消
息队列的内部结构中, msg_perm 成员就是 ipc_perm 类型的,它的定义是在文件 linux/ipc.h 中,
以上所有的成员都具有相当的自扩展性。对象的创建者以及所有者 ( 它们可能会有不同 ) 的
有关信息,以及对象的 IPC 关键字都是存放在该结构中的。八进制形式的访问模式也是存放在
这里的,它是以一种无符号短整型的形式存储的。最后,时间片使用序列编号存放在最后面,
每次通过系统调用关闭 IPC 对象 ( 摧毁 ) 时,这个值将被增加一,至多可以增加到能驻留在系统
中的 IPC 对象的最大数目。用户需要关心这个值吗?答案是