首页 > 其他分享 >POSIX消息队列

POSIX消息队列

时间:2024-07-14 16:29:58浏览次数:17  
标签:attr 队列 int mq 消息 msg POSIX

一.POSIX消息队列概述

什么是POSIX消息队列?
POSIX消息队列是POSIX标准(Portable Operating System Interface)的一部分,它提供了一种进程间通信(IPC)机制,允许不同的进程通过队列交换消息。应用场景:需要异步通信或者多个进程需要协调工作中

1.1POSIX消息队列特点

  1. **独立性:**消息队列独立于创建它的进程,即使创建进程结束了,消息队列依然存在,直到被显式删除。
  2. **数据封装:**消息队列中的消息通常包含两部分,消息体(payload)和消息类型(type)。消息体是实际要传输的数据,而消息类型可以用于区分不同种类的消息。
  3. **先进先出(FIFO):**消息队列按照先进先出的原则处理消息,但也可以按照消息类型或优先级进行排序。
  4. **异步通信:**发送进程将消息发送到队列后可以继续执行,而接收进程可以在任何时间点从队列中读取消息,无需双方同时在线。
  5. **消息优先级:**消息可以设置不同的优先级,高优先级的消息会被优先读取。
  6. **安全性:**可以通过权限控制对消息队列的访问,确保只有授权的进程可以发送或接收消息。
  7. **API支持:**POSIX定义了一系列API来操作消息队列,包括创建、发送、接收、关闭和删除队列等。
  8. **使用场景:**适用于需要进程间通信的各种应用

二.POSIX消息队列常用接口

2.1 mq_open()

1.#include <mqueue.h>
2.  mqd_t mq_open(const char *name, int oflag, mode_t mode,
                     struct mq_attr *attr);
3.功能:创建消息队列或打开一个消息队列
4.参数:
	const char *name 一个指向字符数组的指针,表示消息队列的名称。队列名称必须以斜线 / 开头,后面跟随一个或多个非斜线字符。
	int oflag 一个整数,指定打开消息队列的选项
		O_RDONLY:只读方式打开队列,只能用于接收消息。
		O_WRONLY:只写方式打开队列,只能用于发送消息。
		O_RDWR:读写方式打开队列,可以发送和接收消息。
		O_CREAT:如果队列不存在,则创建新队列。需要与 mode 和 attr 参数一起使用。
		O_EXCL:与 O_CREAT 一起使用,如果队列已存在,则 mq_open 调用失败。
		O_NONBLOCK:非阻塞模式,mq_send 和 mq_receive 调用不会阻塞。	
		
	mode_t mode 消息队列的访问权限
	struct mq_attr *attr 指向 mq_attr 结构的指针,包含消息队列的属性,如最大消息数(mq_maxmsg)、每 个消息的最大大小(mq_msgsize)等。

5.返回值
	失败:-1
	成功:返回一个消息队列描述符mqd_t

2.2 struct mq_attr

POSIX消息队列的属性由mq_attr结构体定义,以下是结构体的主要成员
struct mq_attr
{
    long mq_flags;//阻塞标志, 0(阻塞)或非阻塞O_NONBLOCK
    long mq_maxmsg;//最大消息数
    long mq_msgsize;//每个消息最大大小
    long mq_curmsgs;//当前消息数
};

2.3 mq_send()

1.#include <mqueue.h>
2.int mq_send(mqd_t mqdes, const char *msg_ptr,
                     size_t msg_len, unsigned int msg_prio);
3.功能:用于向指定的消息队列发送消息
4.参数:
	mqd_t mqdes 消息队列描述符,由 mq_open() 函数返回
	msg_ptr 指向要发送消息的缓冲区的指针。
    msg_len  消息的长度,单位为字节。这个长度必须小于或等于创建消息队列时通过 mq_attr 结构体指定的 mq_msgsize。
    msg_prio 消息的优先级,取值范围通常从 0 到 MQ_PRIO_MAX。0 表示最低优先级,而数值越大表示优先级越高。
5.返回值:
	失败:-1
	成功:0

2.4mq_receive()

1.#include <mqueue.h>
2.ssize_t mq_receive(mqd_t mqdes, char *msg_ptr,
                          size_t msg_len, unsigned int *msg_prio);
3.功能:用于从指定的消息队列中接收消息
4.参数:
	mqdes:消息队列描述符,由 mq_open() 函数返回
	msg_ptr:指向用于存储接收到的消息的缓冲区的指针
	msg_len:缓冲区的长度,单位为字节。这个长度必须大于或等于队列中消息的最大长度,即至少为创建消息队列时通过 mq_attr 结构体指定的 mq_msgsize
	msg_prio:指向 unsigned int 类型的指针,用于存储接收到的消息的优先级。如果不想获取优先级,可以传递 NULL。
5.返回值:
	失败:-1
	成功:返回接收到的消息的长度

2.5mq_close()

1.#include <mqueue.h>
2.int mq_close(mqd_t mqdes);
3.功能:用于关闭一个打开的消息队列描述符
4.参数
	mqdes 消息队列描述符,由 mq_open() 函数返回
5.返回值:
	失败:-1
	成功:0

2.6mq_unlink()

1.#include <mqueue.h>
2.int mq_unlink(const char *name);
3.功能:删除指定的消息队列名称。当所有引用该队列的进程都关闭了队列描述符后,队列将被销毁。
4.参数:
	name 这是要删除的消息队列的名称,它必须与创建队列时使用的名称完全相同
5.返回值:
	成功:0
	失败:-1

2.7 struct sigevent

sigevent 结构体是 POSIX 标准中定义的一个结构体,用于指定当某个事件发生时对进程的通知方式。在 POSIX 消息队列和某些其他系统调用中,sigevent 可以用来设置异步事件通知

struct sigevent
{
	int sigev_notify; //指定通知方式
	sigval sigev_value;//传递给信号处理函数或线程的值
	void (*sigev_notify_function)(union sigval);//线程通知函数
	int sigev_notify_attributes;//用于线程属性,如pthread_add_t
}

参数:
	sigev_notify:指定当事件发生时的通知机制,有以下几种方式
	1.SIGEV_NONE:不请求任何形式的通知。
	2.SIGEV_SIGNAL:当事件发生时,发送一个信号给进程。
	3.SIGEV_THREAD:当事件发生时,在一个新的线程中执行一个函数

	sigev_value:这是一个联合体 sigval,可以包含一个整数或一个指针值,具体取决于	通知类型。这个值将传递给信号处理函数或线程函数。
	
	sigev_notify_function:如果 sigev_notify 设置为 SIGEV_THREAD,则此函数指针指定了当事件发生时应该在新线程中调用的函数。这个函数应该接受一个 sigval 类型的参数。
	
	sigev_notify_attributes:如果使用线程通知(SIGEV_THREAD),这个成员指定了线程的属性,通常是 pthread_attr_t 类型的指针,用于初始化新线程的属性。
	
	通常是与mq_notify函数一起使用,以注册对消息到达异步通知

2.8 mq_notify

1.#include <mqueue.h>
2.int mq_notify(mqd_t mqdes, const struct sigevent *sevp);
3.功能:允许调用进程注册或取消,以便在消息队列描述符mqdes引用的空消息队列上到达新消息是发生异步通知
4.参数:
	mqdes 消息队列描述符,由 mq_open() 函数返回
	sevp 指向 sigevent 结构的指针,该结构定义了当消息到达时的异步通知方式。
5.返回值:
	失败:-1
	成功:0

标签:attr,队列,int,mq,消息,msg,POSIX
From: https://blog.csdn.net/2403_83472896/article/details/140418513

相关文章

  • 代码随想录算法训练营第10天|232. 用栈实现队列,225. 用队列实现栈,20. 有效的括号,1047.
    学习任务:Leetcode232.用栈实现队列Leetcode225.用队列实现栈Leetcode20.有效的括号Leetcode1047.删除字符串中的所有相邻重复项Leetcode232.用栈实现队列难度:简单|相关标签:栈、设计、队列题目:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支......
  • 消息队列Kafka简单使用(可以直接上手)
    1.消息中间件简介消息中间件(MessageMiddleware)是一种在分布式系统中用于解耦不同服务或组件的软件,它通过异步消息传递的方式来实现服务之间的通信。消息中间件允许系统组件之间通过发送和接收消息进行交互,而无需知道彼此的具体实现细节,从而提高了系统的可扩展性、灵活性和......
  • Vue 3 后端错误消息处理范例
    1.错误消息格式前后端消息传递时,我们可以通过json的errors字段传递错误信息,一个比较好的格式范例为:{errors:{global:["网络错误"],password:["至少需要一个大写字母","至少需要八位字符"]}}errors中,字段名代表出错位置(如果是输入框的话,对应错误要......
  • 百日筑基第二十天-一头扎进消息队列3-RabbitMQ
    百日筑基第二十天-一头扎进消息队列3-RabbitMQ如上图所示,RabbitMQ由Producer、Broker、Consumer三个大模块组成。生产者将数据发送到Broker,Broker接收到数据后,将数据存储到对应的Queue里面,消费者从不同的Queue消费数据。那么除了Producer、Broker、Queue、Cons......
  • 最小数字游戏(Lc2974)——模拟+优先队列(小根堆)、排序+交换
    你有一个下标从 0 开始、长度为 偶数 的整数数组 nums ,同时还有一个空数组 arr 。Alice和Bob决定玩一个游戏,游戏中每一轮Alice和Bob都会各自执行一次操作。游戏规则如下:每一轮,Alice先从 nums 中移除一个 最小 元素,然后Bob执行同样的操作。接着,Bob会将......
  • 数据结构(队列的实现)
    目录队列队列的定义队列的实现创建队列的结构队列的初始化进行插入数据删除数据计算个数 判断是否为空返回队列头部数据返回队列尾部数据队列队列的定义队列是:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First......
  • 使用Spring Boot实现消息队列
    使用SpringBoot实现消息队列大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代分布式系统中,消息队列是一个非常重要的组件。它可以解耦系统的各个部分,提高系统的可伸缩性和可靠性。本文将详细介绍如何使用SpringBoot实现消息队列,包括消息的发送和接......
  • 8-队列的链式存储结构的操作
    顺序队列的操作#include<stdio.h>#include<stdlib.h>#include<stdbool.h>typedefintElemType;/*链式队列的节点*/typedefstructLinkNode{/*数据域*/ElemTypedata;/*指针域,指向下一个节点*/structLinkNode*next;}LinkNode;/*链式队列*/......
  • 常错过手机的重要消息的帅哥靓女,看过来
    你是不是手机里有许多未读消息,许多“小红点”,系统通知里有很多通知,久而久之你已习惯并麻木了? 你只在自己需要的时候主动去找,而对于推送的信息一概不理。有时也有朋友向你抱怨发给你的信息你久久不回。 或者反过来,你经常去看推送的消息,但大多是不太重要的,是广告,占用了你很多......
  • 「代码随想录算法训练营」第十天 | 栈与队列 part2
    150.逆波兰表达式求值题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/题目难度:中等文章讲解:https://programmercarl.com/0150.逆波兰表达式求值.html视频讲解:https://www.bilibili.com/video/BV1kd4y1o7on题目状态:多次修改bug后通过个人思路:......