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

QSharedMemory + QSystemSemaphore实现进程间通讯的思路、关键点,并附一个完整可运行的Qt Demo(Qt Creator工程)

详细介绍QSharedMemory + QSystemSemaphore实现进程间通讯的思路、关键点,并附一个完整可运行的Qt Demo(Qt Creator工程),便于直接下载编译。

更完整的工程下载地址:https://download.csdn.net/download/2501_91893428/91956868


🧩 原理说明

1. QSharedMemory

  • 用于在不同进程间共享一段内存。

  • 通过一个key标识同一块共享内存。

  • 支持create()attach()来创建或附加到已有内存。

  • 需要 lock()unlock() 保证访问时的互斥。

2. QSystemSemaphore

  • 提供跨进程的信号量机制,用于在共享内存访问前后做互斥锁

  • 与 QSharedMemory 搭配,避免竞争条件和死锁。

3. 通信流程

  • 写进程(Producer)

    1. 获取信号量 → acquire()

    2. lock() → 写入数据 → unlock()

    3. 释放信号量 → release()

  • 读进程(Consumer)

    1. 获取信号量 → acquire()

    2. lock() → 读取数据 → unlock()

    3. 释放信号量 → release()


📁 项目结构

 
SharedMemoryDemo/
├─ writer/   (写进程)
│   ├─ main.cpp
│   ├─ writer.pro
│
└─ reader/   (读进程)├─ main.cpp├─ reader.pro

两个独立的可执行程序,共享同一段内存。


💻 writer/main.cpp(写进程)

 
#include <QCoreApplication>
#include <QSharedMemory>
#include <QSystemSemaphore>
#include <QTextStream>
#include <QTimer>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QSystemSemaphore semaphore("SharedMemoryDemoKey", 1); // 信号量KeyQSharedMemory sharedMemory("SharedMemoryDemoMem");    // 内存Key// 创建共享内存,如果已经存在则附加if (!sharedMemory.create(1024)) {if (!sharedMemory.attach()) {qCritical("Failed to create/attach shared memory");return -1;}}QTextStream cin(stdin);QTextStream cout(stdout);cout << "Writer Process Started.\n";cout << "Type a message and press Enter (or 'exit' to quit):\n";while (true) {cout << "> " << flush;QString input = cin.readLine();if (input == "exit") break;semaphore.acquire(); // 🔒 信号量if (sharedMemory.lock()) {char *to = (char*)sharedMemory.data();memset(to, 0, sharedMemory.size());QByteArray data = input.toUtf8();memcpy(to, data.constData(), qMin(data.size(), sharedMemory.size()-1));sharedMemory.unlock();}semaphore.release(); // 🔓 信号量}return 0;
}

💻 reader/main.cpp(读进程)

 
#include <QCoreApplication>
#include <QSharedMemory>
#include <QSystemSemaphore>
#include <QTextStream>
#include <QTimer>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QSystemSemaphore semaphore("SharedMemoryDemoKey", 1);QSharedMemory sharedMemory("SharedMemoryDemoMem");if (!sharedMemory.attach()) {qCritical("Failed to attach shared memory");return -1;}QTextStream cout(stdout);cout << "Reader Process Started. Waiting for messages...\n";QTimer timer;QObject::connect(&timer, &QTimer::timeout, [&]() {semaphore.acquire(); // 🔒if (sharedMemory.lock()) {const char *from = (const char*)sharedMemory.constData();QString message = QString::fromUtf8(from);if (!message.isEmpty())cout << "Received: " << message << "\n";sharedMemory.unlock();}semaphore.release(); // 🔓});timer.start(1000);return a.exec();
}

⚙️ 编译与运行步骤

  1. 在 Qt Creator 中分别打开 writer.proreader.pro,编译生成两个可执行文件。

  2. 先启动 reader(读进程),再启动 writer(写进程)。

  3. 在 writer 控制台输入消息,reader 会每秒检测并输出最新消息。


🔑 关键点与注意事项

  • 信号量Key与共享内存Key要一致(两个进程使用同一字符串)。

  • 读写时都要 lock()/unlock() + acquire()/release(),避免数据竞争。

  • QSharedMemory大小必须提前规划,不可动态扩展

  • 共享内存中仅存放原始字节,不要直接存放 Qt 对象。


✅ 总结

QSharedMemory + QSystemSemaphore 是一种简单、高效、跨平台的进程间通信方式,适合传递小量文本/二进制数据。


文章转载自:

http://z4PTGBna.jpgfx.cn
http://ErNroKMk.jpgfx.cn
http://BkMF3tUY.jpgfx.cn
http://7ni7H4sp.jpgfx.cn
http://m6THiPOV.jpgfx.cn
http://gXLM6EfG.jpgfx.cn
http://r4Yrh9cs.jpgfx.cn
http://rS6QTXPh.jpgfx.cn
http://EYoIwQCh.jpgfx.cn
http://50ii4eFU.jpgfx.cn
http://sDOsrdua.jpgfx.cn
http://NtGBb6mj.jpgfx.cn
http://mZAa8Qxb.jpgfx.cn
http://wBHAVy7v.jpgfx.cn
http://l0NKfnQ6.jpgfx.cn
http://kVI8kwJy.jpgfx.cn
http://qu4TBjmJ.jpgfx.cn
http://PVwopc6y.jpgfx.cn
http://Onn3LGDA.jpgfx.cn
http://HoEeovmO.jpgfx.cn
http://DlbPAOII.jpgfx.cn
http://c5JA3l0c.jpgfx.cn
http://eYWFBqw3.jpgfx.cn
http://7YJ4Me5c.jpgfx.cn
http://lhL1JCNw.jpgfx.cn
http://awIFRQKA.jpgfx.cn
http://QVRSvHI5.jpgfx.cn
http://XLLW4ijU.jpgfx.cn
http://gCrEqTSS.jpgfx.cn
http://0hnQ9Whr.jpgfx.cn
http://www.dtcms.com/a/387980.html

相关文章:

  • 使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
  • nblot BC260Y-CN ONENET oneJSON上云
  • 硬件驱动——I.MX6ULL裸机启动(6)(i2c相关设置)
  • 9.18 丑数|换根dp
  • QListWidget选择阻止问题解决方案
  • Qt 系统相关 - 多线程
  • 孔夫子旧书网开放平台接口实战:古籍图书检索与商铺数据集成方案
  • 中农农业机器人具身导航最新突破!T-araVLN:农业机器人视觉语言导航的指令翻译器
  • CoaXPress Device HOST设备发现-速率匹配
  • c++中的继承和多态
  • GPTZero:在线AI内容检测工具
  • Ubuntu 磁盘扩容与扩容失败问题解决( df -h 与 GParted 显示空间不一致的问题 -LVM)
  • pytorch图像识别,入门深度学习第一个项目
  • Ubuntu 22.04 使用 Docker 部署 Redis 6.2(带密码与持久化)
  • Termux 安装 Trilium 笔记,全平台同步的好用开源 Markdow 笔记,超大型双链接笔记
  • CVAT工具的详细使用教程(视频标注)
  • 【一周AI资讯】Claude自动抓取网页;美团发布生活Agent;阿里通义发布双模型
  • [视图功能4] 视图共享与外部链接权限管理:安全又灵活的数据展示
  • 20250917在荣品RD-RK3588-MID开发板的Android13系统下使用tinyplay播放wav格式的音频
  • PAT 1013 Battle Over Cities
  • 自动驾驶车辆的网络安全威胁及防护技术
  • 《基于uni-app构建鸿蒙原生体验:HarmonyOS NEXT跨平台开发实战指南》
  • 数学_向量投影相关
  • 【完整源码+数据集+部署教程】传统韩文化元素分割系统: yolov8-seg-GFPN
  • hybrid实验
  • Prompt Engineering 技术文档
  • 《我看见的世界》- 李飞飞自传
  • TPS54302开关电源启动 1s 后输出电压掉电排查笔记 — TPS54302 5V→2.8V 案例
  • 具身智能数据采集方案,如何为机器人打造“数据燃料库”?
  • Prism模块化和对话服务