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

  • 1. 介绍
  • 2. 范例
  • 3. 禁止程序多开

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)及禁止程序多开

转载于:https://www.cnblogs.com/techiel/p/8035263.html

QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开相关推荐

  1. Windows上C++使用共享内存进行进程间通讯

    共享内存 (也叫内存映射文件) 主要是通过映射机制实现的 , Windows 下进程的地址空间在逻辑上是相互隔离的 , 但在物理上却是重叠的 ; 所谓的重叠是指同一块内存区域可能被多个进程同时使用 , ...

  2. 共享内存实现进程间大数据的交换

    引言 进程间的数据交换和共享是一种非常重要和实用的技术.大.中型软件的开发设计多是由众多程序设计人员的合作完成,通常一个程序设计人员只负责其中一个或几个模块的开发,这些模块可以是动态链接库也可以是应用 ...

  3. linux进程间通信:system V 信号量和共享内存实现进程间同步

    关于信号量和共享内存的相关描述已经在前几篇提到过: 信号量:即内核维护的一个正整数,可以使用内核提供的p/v接口进行该正整数的+/-操作,它主要用来表示系统中可用资源的个数,协调各个进程有序访问资源, ...

  4. linux open 头文件_linux下通过共享内存和mmap实现进程间通讯

    前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...

  5. linux mmap实例_Linux下通过共享内存和mmap实现进程间通讯(含实例)

    前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...

  6. linux进程间通讯-共享内存

    文章目录 共享内存概述 共享内存的特点 共享内存操作 在ubuntu 12.04中共享内存限制值如下 获得一个共享存储标识符 创建共享内存 共享内存映射(attach) 解除共享内存映射(detach ...

  7. Linux 进程间通讯详解一

    进程间的通讯 两台主机间的进程通讯 --socket一台主机间的进程通讯 --管道(匿名管道,有名管道) --System V进程间通信(IPC)包括System V消息队列,System V信号量, ...

  8. linux进程间通讯的几种方式的特点和优缺点,和适用场合。

    http://blog.csdn.net/kakaka2011/article/details/6636661 1. 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有 ...

  9. 删除共享内存_进程通信专题之 共享内存

    什么是共享内存呢? 共享内存是被多个进程共享一部分物理内存,共享内存是进程间共享数据最快的办法,因为一个进程向共享内存中写了数据,那么共享的这个区域的所有进程就可以立刻看到这里的数据. 共享内存有什么 ...

最新文章

  1. 深度学习到底有哪些卷积?
  2. 超越对手pdf_如何创建一个超越竞争对手的移动应用
  3. 确定Java开发中.jar包的JDK版本
  4. HTML5原生拖拽/拖放 Drag Drop 详解
  5. Microsoft Dynamics CRM 2015 数据管理 之 如何批量导入数据到 正式区(二)系统自带示例数据 安装及教学...
  6. 《Pro Ogre 3D Programming》 读书笔记 之 第七章 资源管理(转)
  7. java ee 上传文件_17.《JavaEE 学习笔记》Servlet 上传文件
  8. 【图像处理】——上采样、下采样、在模板匹配中的金字塔加速策略
  9. unit类型是什么?_面试官虚晃一枪:项目中有用过锁吗?能解释一下什么是AQS?...
  10. java json.tostring,idea以JSON形式重写toString()方法
  11. 人工智能与机器学习的关系---人工智能工作笔记0013
  12. 2天玩转单反相机(第二讲)
  13. java如何向服务器传文件,详解Java向服务端发送文件的方法
  14. 计算机怎么获取权限删除文件,电脑删除文件需要获取trustedinstaller权限怎么回事...
  15. MFC实现窗口透明,并显示一张透明PNG图片
  16. 红外遥控及Android手机红外遥控器开发
  17. 常用商务邮箱:常用商务邮箱注册
  18. hadoop成功启动后,重新formatamp;nbs…
  19. android 分享纯图片到QQ空间实现方式
  20. 计算机开机f8键,开机F8键“高级启动选项”的秘密

热门文章

  1. vh,vw单位你知道多少?
  2. Linux互斥锁的使用代码实现
  3. vs2010的sdf文件和ipch文件夹
  4. 共享内存---shmget shmat shmdt
  5. gcc -fPIC选项
  6. [react] 使用PropTypes和Flow有什么区别?
  7. [react] React必须使用JSX吗?
  8. [html] 如何使用H5唤起原生地图APP(百度、高德、腾讯地图等)
  9. [html] HTML5如何使用音频和视频?
  10. [html] 说说你对html中的置换元素和非置换元素的理解