Linux进程间通信之消息队列

消息队列


我们可以把消息队列理解为共享的消息链表,它存储在内核中,由消息队列标识符标识。消息队列传输数据的单位是有类型的数据块,这点与管道不同,管道的信息传输是基于字节流。
不同进程发送的数据块可被认为都有自己的类型,而接受端进程接受的数据块可以有不同的类型。
消息队列与管道相同的地方在于他们都是有限的。及既然他们都是一块共享的内存,那么他们必定有大小。

  • msgmax,每个消息的最大长度是有上限的。
    这里写图片描述
  • msgmnb,每个消息队列的最大字节数也是有上限的。
    这里写图片描述
  • msgmni,每个系统上可以存在多少个消息队列也有自己的限制。
    这里写图片描述

XSI IPC结构与消息队列结构


IPC是UNIX系统中进程间通信的统称,有三种称作XSI IPC:消息队列,信号量,共享内存。每创建这三种之间的任何一种,都相当于建立了一个XSI IPC对象。系统为每个IPC对象都维护了一种结构ipc_perm。

struct ipc_perm {
key_t __key; /* Key supplied to xxxget(2) */
uid_t uid; /* Effective UID of owner */
gid_t gid; /* Effective GID of owner */
uid_t cuid; /* Effective UID of creator */
gid_t cgid; /* Effective GID of creator */
unsigned short mode; /* Permissions */
unsigned short __seq; /* Sequence number */
};

其它的先不用管,我们先看它的第一个成员__key,它的类型为key_t。这是系统对IPC资源的唯一标识符。在申请IPC资源前,先要获取此标识符。我们可以通过ftok函数来获得它。

#include<sys/ipc.h>
key_t ftok(const char* path,int id);

第一个参数为给定的路径名,一般我们设置为当前路径“.”。第二个参数id为项目id,我们可以指定一个0~255之前的数来最为项目id。ftok函数会将路径名与项目id相结合,通过特定的方法得出标识符key。

除此之外,每个消息队列都有自己的结构:

这里写图片描述
(信号量,共享内存也有类似的结构)

操作函数


获取消息队列


#include<sys/msg.h>
int msgget(key_t key,int flag);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值