消息队列是Linux IPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据。
消息队列可以认为是一个链表。进程(线程)可以往里写消息,也可以从里面取出消息。
消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。
消息队列是消息的链接表,存放在内核中。
一个消息队列由一个标识符(即队列ID)来标识。独立于进程而存在的,在系统内存中,有内核管理的。
===========================================================================
一个进程可以往某个消息队列里写消息,然后终止,
另一个进程随时可以从消息队列里取走这些消息。
这里也说明了,消息队列具有随内核的持续性,也就是系统不重启,消息队列永久存在。
消息队列的名字只能以一个 ‘/‘开头,名字中不能包含其他的’/’
===========================================================================
相关函数:
//打开或创建一个消息队列
mqd_t mq_open(const char *name, int oflag, mode_t mode, struct mq_attr *attr);
//参数
//name 消息队列的名字
//oflag 打开的方式,可读可写之类的
//mode 可选参数,访问的权限
//attr 用于给队列设置属性
//返回值
//mqd_t 消息队列描述符
//关闭一个消息队列
mqd_t mq_close(mqd_t mqdes);
//和文件的close类型,关闭后,消息队列并不从系统中删除。一个进程结束,会自动调用关闭打开着的消息队列。
//删除一个消息队列
mqd_t mq_unlink(const char *name);
//消息队列创建后只有通过调用该函数或者是内核自举才能进行删除。
//每个消息队列都有一个保存当前打开着描述符数的引用计数器,和文件一样,因此本函数能够实现类似于unlink函数删除一个文件的机制。
mq_attr //POSIX消息队列的属性
long mq_flags //消息队列的标志:0或O_NONBLOCK,用来表示是否阻塞
long mq_maxmsg //消息队列的最大消息数
long mq_msgsize //消息队列中每个消息的最大字节数
long mq_curmsgs //消息队列中当前的消息数目
mqd_t mq_getattr(mqd_t mqdes, struct mq_attr *attr);
//mq_getattr用于获取当前消息队列的属性,mq_setattr用于设置当前消息队列的属性。其中mq_setattr中的oldattr用于保存修改前的消息队列的属性,可以为空。
mqd_t mq_setattr(mqd_t mqdes, struct mq_attr *newattr, struct mq_attr *oldattr);
//mq_setattr可以设置的属性只有mq_flags,用来设置或清除消息队列的非阻塞标志。newattr结构的其他属性被忽略。
//mq_maxmsg和mq_msgsize属性只能在创建消息队列时通过mq_open来设置。mq_open只会设置该两个属性,忽略另外两个属性。
//mq_curmsgs属性只能被获取而不能被设置。
POSIX消息队列的使用
mqd_t mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio);
//成功返回0,出错返回-1
mqdes:消息队列描述符;
msg_ptr:指向消息体缓冲区的指针;
msg_len:消息体的长度,其中mq_receive的该参数不能小于能写入队列中消息的最大大小,即一定要大于等于该队列的mq_attr结构中mq_msgsize的大小。如果mq_receive中的msg_len小于该值,就会返回EMSGSIZE错误。POXIS消息队列发送的消息长度可以为0。
msg_prio:消息的优先级;它是一个小于MQ_PRIO_MAX的数,数值越大,优先级越高。POSIX消息队列在调用mq_receive时总是返回队列中最高优先级的最早消息。如果消息不需要设定优先级,那么可以在mq_send是置msg_prio为0,mq_receive的msg_prio置为NULL。
mqd_t mq_receive(mqd_t mqdes, char *msg_ptr,size_t msg_len, unsigned *msg_prio);
//成功返回接收到消息的字节数,出错返回-1
POSIX消息队列的限制:
POSIX消息队列本身的限制就是mq_attr中的mq_maxmsg和mq_msgsize,分别用于限定消息队列中的最大消息数和每个消息的最大字节数。
在前面已经说过了,这两个参数可以在调用mq_open创建一个消息队列的时候设定。当这个设定是受到系统内核限制的。
===========================================================================
参考链接:
POSIX 消息队列函数(mq_open、mq_getattr、mq_send、mq_receive)示例:https://blog.csdn.net/mayue_web/article/details/92712163