一、介绍
mq_open mq_close mq_unlink mq_setattr mq_getattr mq_send mq_receive
是 POSIX 消息队列(POSIX message queues)中用于发送和接收消息的函数。POSIX 消息队列是一种进程间通信(IPC)机制,允许进程以消息的形式交换数据。
哈哈哈哈,先了解一下函数,最后来个案例。
二、mq_open
功能:打开(如果已存在)或创建一个消息队列。
- name:消息队列的名称,必须是以斜杠(/)开头的绝对路径名。
- oflag:操作标志,可以是 O_NONBLOCK(非阻塞模式)和 O_CREAT(如果队列不存在则创建)的组合。
- mode:如果 O_CREAT 被设置,则指定新创建队列的权限。
- attr:指向 mq_attr 结构体的指针,用于指定队列的属性(如最大消息大小和队列容量)。如果为 NULL,则使用默认属性。
返回值:成功时返回消息队列描述符,失败时返回 (mqd_t)-1 并设置 errno。
三、mq_send
功能:用于将一条消息发送到指定的消息队列中。
mqdes:消息队列描述符,由 mq_open 返回。 msg_ptr:指向要发送的消息的指针。 msg_len:消息的长度(以字节为单位),必须小于或等于消息队列的 mq_msgsize 属性。 msg_prio:消息的优先级,一个无符号整数,值越大优先级越高。
如果函数成功,返回 0;如果失败,返回 -1 并设置 errno 以指示错误。
四、mq_receive
mq_receive 函数用于从指定的消息队列中接收一条消息。
mqdes:消息队列描述符。 msg_ptr:指向接收消息的缓冲区的指针。 msg_len:缓冲区的长度(以字节为单位),应足够大以容纳可能接收到的最大消息。 msg_prio:如果非 NULL,则用于存储接收到的消息的优先级。
如果成功,mq_receive 返回接收到的消息的实际长度(以字节为单位)。如果失败,则返回 -1 并设置 errno。
五、mq_close
功能:关闭消息队列描述符。
- mqdes:消息队列描述符。
返回值:成功时返回 0,失败时返回 -1 并设置 errno。
六. mq_unlink
功能:删除消息队列。
name:消息队列的名称。
返回值:成功时返回 0,失败时返回 -1 并设置 errno。
七、mq_setattr
功能:设置消息队列的属性。
mqdes:消息队列描述符。 newattr:指向新的 mq_attr 结构体的指针。 oldattr:如果非 NULL,则用于存储旧属性的副本。
返回值:成功时返回 0,失败时返回 -1 并设置 errno。
八、 mq_getattr
功能:获取消息队列的属性。
mqdes:消息队列描述符。 mqstat:指向 mq_attr 结构体的指针,用于存储队列的属性。
返回值:成功时返回 0,失败时返回 -1 并设置 errno。
九、消息队列案例
接收端代码
发送端代码
要运行这段代码实现进程间通信,可以按照以下步骤进行:
- 编译代码: 使用 C++ 编译器(如 g++)编译代码。
2. 运行程序: 打开两个终端窗口,分别代表两个不同的进程。 在一个终端中运行编译后的程序:
3. 在另一个终端中,稍等片刻后再次运行编译后的程序mqsend。这样两个进程就会尝试通过消息队列进行通信。
十、Message too long 和 Invalid argument错误处理
10.1 Message too long
mq_recv出现如下错误 Message too long
添加图片注释,不超过 140 字(可选)
怎么解决的呢,大家对比一下前面 发送端案例 和接收端案例 时的 mq_open 。出现错误时, 发送端案例 和接收端案例 mq_open 设置都是如下。
接收端案例 mq_open设置修改为如下后,就可以跑了。据说是mq_maxmsg和mq_msgsize的设置导致的。
10.2 Invalid argument
当我把mqAttr.mq_maxmsg = 10;改为mqAttr.mq_maxmsg = 100;就报下面的错
添加图片注释,不超过 140 字(可选)
改回去就好。
mq_maxmsg限定消息队列中的最大消息数,mq_msgsize限定每个消息的最大字节数。
10.3 数据不全和数据乱码
消息队列数据传输时,出现了数据不全或数据乱码的情况。
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
将代码中的sizeof修改为strlen就解决了。sizeof和strlen的区别参考这
获取char*字符串指针指向的数组长度时,记得用strlen,而不是sizeof-CSDN博客
十一、结果
当然在一个终端上可以收到另一个终端的消息啦
添加图片注释,不超过 140 字(可选)