您的位置:首页 > 其它

IPC实现机制(三)---消息队列

2017-06-03 14:40 169 查看
一、什么是消息队列

消息队列就是消息的链表,位于内核中。

消息队列中每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值

消息队列是基于消息的,管道是基于字节流的,

且消息队列的读取不一定是先入先出。

消息队列却是随内核的,即使该进程消亡了该内核中的消息队列是不会主动消失的,除非使用ipcrm -q + msg_id删除该消息队列。

二、消息队列的特征:

消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法,其特点如下:

(1)消息队列可以实现消息的随机查询。消息不一定要以先进先出的次序读取,编程时可以按消息的类型读取。

(2)消息队列允许一个或多个进程向它写入或者读取消息

(3)与无名管道、命名管道一样,从消息队列中读出消息,消息队列中对应的数据都会被删除。

(4)每个消息队列都有消息队列标识符,消息队列的标识符在整个系统中是唯一的。

(5)消息队列是消息的链表,存放在内存中由内核维护只有内核重启或人工删除消息队列时,该消息队列才会被删除。若不人工删除消息队列,消息队列会一直存在于系统中。

(6)消息队列中每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值

三、消息队列常用的函数

key_t ftok(const char *pathname,int proj_id);//创建key_t值

int msgget(key_t key, int msgflg);  //创建消息队列,并返回消息队列标识符

int msgrcv(int msqid, const void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);  //向消息队列写数据

int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);  //从消息队列读数据

int msgctl(int msqid, int cmd, struct msqid_ds *buf); //设置消息队列属性(可用于删除消息队列)












四、消息队列的查看和删除;

(1)创建一个消息队列:



(2)查看消息队列 —指令 ipcs -q



(3)消息队列的删除



四、实现消息对列的双向通信
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ipc