当前位置: 首页 > 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.dtcms.com/a/309347.html

相关文章:

  • Java与Kotlin中“==“、“====“区别
  • 解锁 Grok-4 —— 技术架构、核心能力与API获取指南
  • 梯度下降的基本原理
  • 如何改变Jupyter的默认保存路径?
  • 电子邮箱域名解析原理
  • Scene as Occupancy
  • 深入剖析Spring IOC容器——原理、源码与实践全解析
  • Charles中文版抓包工具详解 实现API调试提效与流量分析优化
  • 肖特基二极管MBR0540T1G 安森美ON 低电压 高频率 集成电路IC 芯片
  • Linux 系统监控脚本实战:磁盘空间预警、Web 服务与访问测试全流程
  • 嵌入式 Linux 深度解析:架构、原理与工程实践(增强版)
  • 60 GHz DreamHAT+ 雷达已被正式批准为“Powered by Raspberry Pi”产品
  • 浏览器【详解】requestIdleCallback(浏览器空闲时执行)
  • CS224n:Word Vectors and Word Senses(二)
  • LOVON——面向足式Open-Vocabulary的VLN导航:LLM做任务分解、YOLO11做目标检测,最后L2MM将指令和视觉映射为动作,且解决动态模糊
  • 九联UNT403HS_海思MV320处理器_安卓9-优盘强刷刷机包
  • 从内部保护你的网络
  • Android ConstraintLayout 使用详解
  • CAN总线协议
  • 【机器学习与数据挖掘实战 | 医疗】案例20:基于交叉验证和LightGBM算法的糖尿病遗传风险预测
  • FastDDS (SharedMemory)
  • Mysql监控数据库
  • synchronized 深度剖析:从语法到锁升级的完整演进
  • VSCode:通义灵码插件安装使用 -- 免费AI编程工具
  • 登录校验一
  • 抢占先机,PostgreSQL 中级专家认证的职业跃迁
  • 逻辑回归在银行贷款审批中的应用:参数选择与实践
  • grafana/lock-stack 日志 Pipeline 配置
  • 性能监控体系:InfluxDB Grafana Prometheus
  • 【东枫科技】DreamHAT+