Qt 读写共享内存 本是古典 何须时尚 2022-12-11 13:35 451阅读 0赞 ### Qt 读写共享内存 ### **一、简述** 记--使用Qt进行简单的读写共享内存。 **二、工程结构** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70][] **三、测试代码** #include <QDebug> #include <QSharedMemory> //测试使用的数据结构 typedef struct{ int age; char name[12]; }PeopleInfo_t;//注意考虑内存对齐,尽量凑为8的倍数,不够的添加保留位 //定义共享内存的大小 #define SHM_SIZE (sizeof(PeopleInfo_t)) int main(int argc, char *argv[]) { Q_UNUSED(argc); Q_UNUSED(argv); bool isOK; /************************************ [1] 将数据写入共享内存 ****************************************/ //1 创建共享内存操作对象 QSharedMemory *shm_write = new QSharedMemory("QtShmTest"); //2 创建共享内存 isOK = shm_write->create(SHM_SIZE, QSharedMemory::ReadWrite); if (!isOK) { qDebug()<<"create shm failed."; return -1; } //准备数据 PeopleInfo_t people = {71, "zhangsan"}; //3 写入数据 shm_write->lock();//上锁 char *shm_addr = (char *)shm_write->data();//获取共享内存映射首地址 memcpy(shm_addr, &people, qMin(SHM_SIZE, sizeof(people)));//写入数据, 这里注意写入的数据长度不能超过共享内存的大小 shm_write->unlock();//解锁 //4 释放共享内存 //shm_write->detach(); //因为后面要测试读取,这里放在最后释放 /************************************ [2] 从共享内存读物数据 ****************************************/ //1 创建共享内存操作对象 QSharedMemory *shm_read = new QSharedMemory("QtShmTest"); //2 关联到指定的共享内存 shm_read->attach(QSharedMemory::ReadOnly);//只读 //3 读取数据 PeopleInfo_t peopleInfo = {0, ""}; shm_read->lock();//加锁 memcpy(&peopleInfo, shm_read->constData(), qMin(SHM_SIZE, sizeof(PeopleInfo_t))); shm_read->unlock();//解锁 //4 释放资源 shm_read->detach(); qDebug()<<"age:"<<peopleInfo.age<<" name:"<<peopleInfo.name; qDebug()<<"QtShm Test Finish. 2020.10.01 "; shm_write->detach(); return 0; } **四、效果** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 1][] **五、总结** 5.1 注意事项 读写共享内存注意不要超过共享内存大小,注意加锁和解锁防止出现死锁情况,共享内存数据结构需要注意内存对齐,不然数据会发生偏移。 加锁解锁操作会降低操作共享内存的效率,但不加锁就容易导致几个程序同时修改共享内存从而发生数据丢失(相互覆盖) 所以对共享内存写入数据有必要加锁,对于读取共享内存数据,看具体需求(实时性,数据容错性,数据完整性),一般都会加锁。 5.2 重要步骤 1. 创建共享内存操作对象 QSharedMemory(const QString &key, QObject *parent = Q_NULLPTR); 2. 创建共享内存 bool create(int size, AccessMode mode = ReadWrite); 3. 共享内存关联--非创建者就需要关联,创建共享内存的不用该步骤 bool isAttached() const;//判断是否已经关联 bool attach(AccessMode mode = ReadWrite);//关联并指定读写方式 4. 共享内存数据操作,共享内存首地址 void *data(); const void* constData() const; const void *data() const; 5 释放--取消关联 bool detach(); 如果没有程序关联该共享内存,该共享内存才会真正被释放、被系统回收。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70]: /images/20221123/9aadc8e9e65f4f3ca8a5176681e623bf.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmZlaWJ1eWk_size_16_color_FFFFFF_t_70 1]: /images/20221123/8745dbc533b246808bbbb99841b04e4a.png
相关 Qt多进程共享内存 Qt提供了一种安全的共享内存的实现QSharedMemory,以便在多线程和多进程编程中安全的使用。 先说下实现共享内存的步骤,然后用一具体的实例说明。 (一)向 r囧r小猫/ 2022年12月15日 11:16/ 0 赞/ 319 阅读
相关 210307共享内存的读写 目录 一、学习的知识点 systemV POSIX(可移植操作系统接口)是一种标准 共享内存的读写 二、上课没有听懂或 蔚落/ 2022年11月06日 00:50/ 0 赞/ 202 阅读
相关 qt共享内存 [qt 共享内存(QSharedMemory)][qt _QSharedMemory] ——————————————————写入部分———————————————— 怼烎@/ 2022年10月22日 15:54/ 0 赞/ 244 阅读
相关 共享内存 1.共享内存 a.操作步骤 (1)创建共享内存 (2)映射共享内存 (3)分离共享内存 (4)控制、删除共享内存 b.相关函数 1.shmget 作用:在 男娘i/ 2022年07月15日 13:23/ 0 赞/ 213 阅读
相关 共享内存 共享内存 是被多个进程共享的一部分物理内存,共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以理科看到其 小灰灰/ 2022年07月15日 01:38/ 0 赞/ 279 阅读
相关 共享内存 共享内存 是被多个进程共享的一部分物理内存,共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以理科看到其 淡淡的烟草味﹌/ 2022年07月15日 01:38/ 0 赞/ 258 阅读
相关 共享内存 之前我们已经了解了管道和消息队列:[http://blog.csdn.net/qq\_34021920/article/details/79596262][http_blog. 蔚落/ 2022年06月14日 03:52/ 0 赞/ 273 阅读
相关 linux 共享内存 共享内存允许两个或多个进程进程共享同一块内存(这块内存会映射到各个进程自己独立的地址空间)从而使得这些进程可以相互通信。在GNU/Linux中所有的进程都有 唯一的虚 电玩女神/ 2022年03月20日 08:56/ 0 赞/ 331 阅读
相关 共享内存 共享内存头文件为shm.h 共享内存可以视为进程间通信速度最快的方式 共享内存实现函数非常简单, shmctl shmget shmat shmdt 这四个函数是共... 我就是我/ 2021年05月17日 14:09/ 0 赞/ 526 阅读
还没有评论,来说两句吧...