linux进程间通信之消息队列

        上周因课题的需要,写了一个进程间使用消息队列通信的程序。之所以,用因为消息队列是随内核存在的,即使进程退出它仍然存在 。消息队列的这种特点正适合我的需要。下面是来自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 对象的最大数目。用户需要关心这个值吗?答案是

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值