当前位置: 首页 > news >正文

linux中posix消息队列的使用记录

        在linux中使用posix中的消息队列时遇到了一个问题,就是在发送消息时,如果队列满了,mq_send接口会一直阻塞,经过查找资料后才发现,该接口默认是阻塞的,也就是说,当队列满了以后,接口会一直等待,一直等到队列中有空间后才返回。

避免阻塞的方式有以下几种:

1、设置为非阻塞模式

在打开队列时,设置指定为O_NONBLOCK的标志,如下所示:

mqd_t mq = mq_open("/myqueue", O_WRONLY | O_CREAT | O_NONBLOCK, 0644, &attr);

如果队列满了,该接口会立即返回-1,errno=11,也就是EAGAIN;

我使用的就是这种方式;

2、使用超时返送函数mq_timedsend(),参考代码如下所示:

#include <mqueue.h>
#include <time.h>struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);  // 获取当前时间
ts.tv_sec += 5;  // 设置 5 秒超时int ret = mq_timedsend(mq, msg_ptr, msg_len, msg_prio, &ts);
if (ret == -1) {if (errno == ETIMEDOUT) { /* 处理超时 */ }
}

注意,这个接口中的时间是系统绝对时间,表示相对时间,所以需要先获取当前的系统时间,再加上超时的时间;

这种方式我没有使用,是deepseek提供的方式;

3、增加消息队列容量

这种方式不解决根本问题,队列满了,依然是阻塞;

        有一点儿需要注意,posix的消息队列时系统级的,如果队列满了,也没有消费者去读取队列里面的数据,这个时候,只能重启系统,才能将队列数据清空;

http://www.lryc.cn/news/606885.html

相关文章:

  • 鸿蒙系统下的动态负载均衡实战:让分布式任务调度更智能
  • 等保2.0指南:从系统等级划分到测评全流程攻略
  • 【PyTorch✨】01 初识PyTorch
  • 算法提升之数学(唯一分解定理)
  • 【unity小技巧】封装unity适合2D3D进行鼠标射线检测,获取鼠标位置信息检测工具类
  • Linux通用SPI作为Master——回环测试
  • 多屏混合KVM Dock扩展坞 如何打造极致高效生产力
  • 9.1无法恢复的错误与 panic!
  • Codeforces Round 1040 (Div. 2) A - D题详细题解
  • 第13届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2021年10月24日真题
  • 项目上传到github中
  • Web3.0如何塑造互联网的未来
  • Spring AI MCP:解锁大模型应用开发新姿势
  • GitLab Docker Compose 迁移后 Redis 权限问题排查与解决
  • Linux中Docker Swarm介绍和使用
  • 深度学习-梯度爆炸与梯度消失
  • 宝塔服务器挂载数据盘
  • Hive SQL (HQL) 编辑指南
  • Jupyter Notebook 使用指南
  • 深度解析:Nginx的卓越性能
  • Java 24 新特性解析与代码示例
  • 理想I8对撞乘龙卡车,AI基于数学和物理的角度如何看?
  • macOS卸载.net core 8.0
  • 基于OpenCV的cv2.solvePnP方法实现头部姿态估计
  • STM32-ESP8266Wi-Fi模块使用USART实现通信/创建AP和STA模式配置教程(寄存器版)
  • 预测性维护之温振传感器选型与应用秘籍
  • ubuntu22.04系统入门 linux入门(二) 简单命令 多实践以及相关文件管理命令
  • Node.js的用途和安装方法
  • CS231n2017-Lecture9经典CNN架构笔记
  • 关于继承的一些知识(C++)