一.POSIX消息队列概述
什么是POSIX消息队列?
POSIX消息队列是POSIX标准(Portable Operating System Interface)的一部分,它提供了一种进程间通信(IPC)机制,允许不同的进程通过队列交换消息。应用场景:需要异步通信或者多个进程需要协调工作中
1.1POSIX消息队列特点
- **独立性:**消息队列独立于创建它的进程,即使创建进程结束了,消息队列依然存在,直到被显式删除。
- **数据封装:**消息队列中的消息通常包含两部分,消息体(payload)和消息类型(type)。消息体是实际要传输的数据,而消息类型可以用于区分不同种类的消息。
- **先进先出(FIFO):**消息队列按照先进先出的原则处理消息,但也可以按照消息类型或优先级进行排序。
- **异步通信:**发送进程将消息发送到队列后可以继续执行,而接收进程可以在任何时间点从队列中读取消息,无需双方同时在线。
- **消息优先级:**消息可以设置不同的优先级,高优先级的消息会被优先读取。
- **安全性:**可以通过权限控制对消息队列的访问,确保只有授权的进程可以发送或接收消息。
- **API支持:**POSIX定义了一系列API来操作消息队列,包括创建、发送、接收、关闭和删除队列等。
- **使用场景:**适用于需要进程间通信的各种应用
二.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