版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
本文标题:QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开     本文地址:http://techieliang.com/2017/12/685/

1. 介绍

很简单的库,直接看帮助文档:http://doc.qt.io/qt-5/qsharedmemory.html

主要函数:设置key,create向系统申请建立一个内存空间、attach当前进程与内存绑定、detach解除绑定,lock/unlock同步锁,data/constdata获取内存指针

创建者流程:setkey,create,attach,lock,data,操作data,unlock,不用的时候detach

访问者:setkey,attach,lock,data,操作data,unlock,不用的时候detach?? 不需要create了

  • 作为创建者应该确定别人也不用了再解绑
  • QSharedMemory析构是也会自动detach
  • 一个内存空间如果0个attach时会被销毁,数据就没了
  • 读写操作记着lock,注意不要忘了unlock
  • 没有create的key,在调用attach时会返回false,注意这句在禁止程序多开有用

size获取共享内存大小,error/errorString是错误信息,isAttached判断当前进程是否已经绑定到内存。

2. 范例

偷个懒,写到一起了:

  1. #include <QCoreApplication>
  2. #include <QSharedMemory>
  3. #include <QDebug>
  4. int main(int argc, char *argv[]) {
  5. QCoreApplication a(argc, argv);
  6. //创建的同时设置key,也可以setKey
  7. QSharedMemory sm("test_shared");
  8. //如果是第一个使用必须先创建
  9. //其余进程不需要创建直接attach
  10. if(!sm.create(1024))
  11. qDebug()<<"create error";
  12. sm.attach();//绑定内存
  13. //attach会返回bool,可以不用下面方式判断
  14. if(!sm.isAttached())
  15. qDebug()<<"attach error";
  16. sm.lock();
  17. int *memdata = static_cast<int*>( sm.data() );
  18. *memdata = 1024;
  19. sm.unlock();
  20. //如此偷懒!想要测试多进程把下面拷走建项目
  21. QSharedMemory testsm("test_shared");
  22. testsm.attach();
  23. int *testdata = static_cast<int*>( testsm.data() );
  24. qDebug()<<*testdata;
  25. //使当前进程与内存分离,析构的时候也会自动调用
  26. sm.detach();
  27. return a.exec();
  28. }

testsm析构时会调用detach,可以吧sm.detach();放在QSharedMemory testsm(“test_shared”);? 就会看到出错了

3. 禁止程序多开

  1. #include <QCoreApplication>
  2. #include <QSharedMemory>
  3. int main(int argc, char *argv[]) {
  4. QCoreApplication a(argc, argv);
  5. //创建的同时设置key,也可以setKey
  6. QSharedMemory sm("test_shared");
  7. if(sm.attach())
  8. return 0;
  9. sm.create(1);
  10. MainWindow w;
  11. w.show();
  12. return a.exec();
  13. }

很简单的原理,只要有一个开启成功那就会create一个1大小的空间,后续再开程序就能attach了然后就return了……

转载请以链接形式标明本文标题和地址:Techie亮博客 » QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开

QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开的更多相关文章

  1. ACE框架 基于共享内存的进程间通讯

    ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_ ...

  2. Android AIDL 进行进程间通讯(IPC)

    编写AIDL文件时,需要注意: 1.接口名和aidl文件名相同. 2.接口和方法前不用加访问权限修饰符 (public.private.protected等,也不能用final.static). 3. ...

  3. High Performance Networking in Google Chrome 进程间通讯(IPC) 多进程资源加载

    小结: 1. 小文件存储于一个文件中: 在内部,磁盘缓存(disk cache)实现了它自己的一组数据结构, 它们被存储在一个单独的缓存目录里.其中有索引文件(在浏览器启动时加载到内存中),数据文件( ...

  4. 进程间通讯IPC的几种方式总结

    Linux进程间的通讯 Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同.前者对Unix早期的进程间通信 ...

  5. 服务 远程服务 AIDL 进程间通讯 IPC

    Activity aidl接口文件 package com.bqt.aidlservice;  interface IBinderInterface {     /* 更改文件后缀为[.aidl]去掉 ...

  6. 服务 进程间通讯 IPC AIDL Parcelable 简介

    1.IBinder和Binder是什么鬼? 我们来看看官方文档怎么说: 中文翻译:  IBinder是远程对象的基本接口,是为了高性能而设计的轻量级远程调用机制的核心部分. 但他不仅用于远程调用,也用 ...

  7. 服务 远程服务 AIDL 进程间通讯 IPC 深化

    示例 aidl接口文件 package com.bqt.aidlservice.aidl; parcelable Person;  package com.bqt.aidlservice.aidl; ...

  8. Windows进程间通讯(IPC)----共享内存

    Windows中同一个EXE文件多次加载过程 Windows中EXE文件加载是基于内存映射文件的. 当EXE文件第一次被加载. 首先系统会先创建一个进程内核对象,并创建一个新的进程地址空间. 系统调用 ...

  9. win32进程间通讯--共享内存

    小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 hMa ...

随机推荐

  1. Nginx部署tomcat/wildfly集群负载均衡

    1.调度器配置: docker run -p 80:80 --name nginx --restart=always  -v /root/nginx/www/:/usr/share/nginx/htm ...

  2. Go黑帽子

    使用go语言来实现python黑帽子和绝技的代码 1.unix密码破解器 package main import( "bufio" "flag" "i ...

  3. svn文件管理

    将VS2010工程提交给Git管理时需要哪些文件:    *.h  *.cpp  *.sln  *.vcxproj  *.vcxproj.filters  *.qrc以及Resources目录下的资源 ...

  4. 20155214 2016-2017-2 《Java程序设计》第2周学习总结

    20155214 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 Java的基本类型比C多了boolean型和byte型,缺少了long double型,ch ...

  5. 20155229 2016-2017-2 《Java程序设计》第四周学习总结

    20155229 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 第六章: extends:继承某个类,继承之后可以使用父类的方法,也可以重写父类的方法,只要 ...

  6. 20155305 2016-2017-2 《Java程序设计》 实验五 Java网络编程及安全实验报告

    20155305 2016-2017-2 <Java程序设计> 实验五 Java网络编程及安全实验报告 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传 ...

  7. 20155217 实验四《Java面向对象程序设计》实验报告

    20155217 实验四<Java面向对象程序设计>实验报告 一.实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局 ...

  8. [2016北京集训试题8]连在一起的幻想乡[dp+无向图计数]

    Description Solution 本博客参考yww大佬的博客,为了加深理解我就自己再写一遍啦. 以下的“无向图”均无重边无自环. 定义f0[n]为n个点构成的无向图个数,f1[n]为n个点构成 ...

  9. 【转载】OGRE 2.1 Windows 编译

    OGRE 2.1 Windows 编译 环境: Windows 7 64Bit Visual Studio 2012 OGRE 2.1 CMake 2.8.12.1 OGRE: OGRE官方推出了最新 ...

  10. ELKStack入门篇(三)之logstash收集日志写入redis

    1.部署Redis 1.1.下载redis [root@linux-node2 ~]# wget http://download.redis.io/releases/redis-4.0.6.tar.g ...