一、什么是消息队列?
消息队列就是消息的链表,存放在内核中并由消息队列标识符表示。
消息队列提供了一个从一个进程向另一个进程发送数据块的方法,每一个数据块都可以被认为是有一个类型,接收者接受的数据块可以有不同的类型。
但是和管道类似的是,它有一个不足就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数(MSGMNB),系统上消息队列的总数上线(MSGMNI)。
内核为每个IPC对象维护了一个数据结构struc ipc_perm,用于标识消息队列,让进程知道当前操作的是那个消息队列。
每一个Msqid_ds 表示一个消息队列,并通过msqid_ds.msg_first、msg_last 维护一个先进先出的msg链表队列,当发送一个消息到该消息队列时,把发送的消息队列构造成一个msg的结构对象,并添加到msqid_ds.msg_first、msg_last维护的链表队列。
二、特点
- 是消息的链表。具有特定的格式,存放在内存中, 由消息队列标识符标识
- 消息队列允许一个或者多个消息队列向他写入与读取消息
- 消息列可实现消息的随机查询,不一定要以先进先出的顺序读取,也可以按照类型进行读取。
- 生命周期随内核,消息队列会一直存在,需要我们显示的调用接口删除或者使用命令删除。
- 消息队列可以双向通信
- 克服了管道口只能承载无格式字节流的缺点
三、相关函数
- msgget(): 用来创建或者访问一个消息队列;
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
int msgget(key_t key, int msgflag);
参数
key: 某个消息队列的名字,用ftok()产生
msgflag: 有两个选项IPC——CREAT 和 IPC_EXCL,单独使用IPC_CREAT,如果消息队列不存在则创建之,如果存在则打开返回;单独使用IPC_EXCL是没有意义的;两个同时使用,如果消息队列不存在则创建之,如果存在就出错返回。
返回值: 成功安徽一个非负整数,即消息队列的标识码,失败返回-1
#include<sys/types.h>
#include<sys/ipc.h>
key_t ftok(const char *pathname ,int proj_id);
调用成功返回一个key值,用于创建消息队列,如果失败,返回-1;
- msgsnd(): 用来把消息添加到消息队列中;
- msgrcv(): 从一个消息队列中获取消息;
- msgctl(): 作用和共享内存相似;