1、消息队列的简介
消息队列作为通信方式的一种,在本质上是位于内核空间的链表,每个链表的节点都是一条消息。每条消息都有自己的消息类型且消息类型必须大于0。每种消息类型都被所对应的链表所维护。
如图1,2,3,4表示不同的数据,消息类型为 0 的链表记录了所有消息加入队列的顺序,其中红色箭头表示消息加入的顺序。
图片及简介参考自:
简书博主小Q_wang
2、 linux 下消息队列查看和删除指令
ipcs --查看进程间通信状态(包括键值、id.....如下)
ipcs -q --只查看消息队列的信息
ipcrm -q id --删除指定的消息队列(id为消息队列的标识符)
3、消息队列相关函数
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// 访问或创建消息队列 并返回消息队列的标识符
int msgget(key_t key, int msgflg)
// 将消息发送到消息队列
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
// 从消息队列获取消息
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
// 查看、设置、删除消息队列
int msgctl(int msqid, int command,struct msqid_ds *buf)
4、msgget函数
函数作用:
访问一个消息队列或创建一个消息队列设置权限,并返回消息队列的标志符
参数使用:
int msgget(key_t key, int msgflg)
参数一:键值或者理解成暗号,大于0的32位整数
可以手动输入一个整形或者通过ftok返回的IPC键值
参数二:IPC_CREAT|0666 表示创建并设置权限
(后面权限数字不固定)
IPC_EXCL 表示访问
返回值:成功返回消息队列号, 失败并设置 errno
5、msgsnd函数
函数作用:
将消息写入到消息队列,或者说发送消息
参数使用:
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
参数一:消息队列标识符
参数二:发送到队列的信息结构体地址,可以是任意类型的结构体,只要求第一个字段必须为long
参数三:要发送信息的大小,不包含信息类型占用的4个字节
参数四:0:若消息队列满了,阻塞等待
IPC_NOWAIT:若消息队列满了,不阻塞直接返回
IPC_NOERROR:实际信息长于参数三设定,截取部分发送,其余抛弃,不报错
返回值:0 表示成功,-1 失败并设置 errno
6、msgrcv函数
函数作用:
从消息队列读取信息,每读取一条少一条,否则阻塞等待
参数使用:
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg