QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开
本文标题: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. 范例
偷个懒,写到一起了:
- #include <QCoreApplication>
- #include <QSharedMemory>
- #include <QDebug>
- int main(int argc, char *argv[]) {
- QCoreApplication a(argc, argv);
- //创建的同时设置key,也可以setKey
- QSharedMemory sm("test_shared");
- //如果是第一个使用必须先创建
- //其余进程不需要创建直接attach
- if(!sm.create(1024))
- qDebug()<<"create error";
- sm.attach();//绑定内存
- //attach会返回bool,可以不用下面方式判断
- if(!sm.isAttached())
- qDebug()<<"attach error";
- sm.lock();
- int *memdata = static_cast<int*>( sm.data() );
- *memdata = 1024;
- sm.unlock();
- //如此偷懒!想要测试多进程把下面拷走建项目
- QSharedMemory testsm("test_shared");
- testsm.attach();
- int *testdata = static_cast<int*>( testsm.data() );
- qDebug()<<*testdata;
- //使当前进程与内存分离,析构的时候也会自动调用
- sm.detach();
- return a.exec();
- }
testsm析构时会调用detach,可以吧sm.detach();放在QSharedMemory testsm(“test_shared”);? 就会看到出错了
3. 禁止程序多开
- #include <QCoreApplication>
- #include <QSharedMemory>
- int main(int argc, char *argv[]) {
- QCoreApplication a(argc, argv);
- //创建的同时设置key,也可以setKey
- QSharedMemory sm("test_shared");
- if(sm.attach())
- return 0;
- sm.create(1);
- MainWindow w;
- w.show();
- return a.exec();
- }
很简单的原理,只要有一个开启成功那就会create一个1大小的空间,后续再开程序就能attach了然后就return了……
转载于:https://www.cnblogs.com/techiel/p/8035263.html
QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开相关推荐
- Windows上C++使用共享内存进行进程间通讯
共享内存 (也叫内存映射文件) 主要是通过映射机制实现的 , Windows 下进程的地址空间在逻辑上是相互隔离的 , 但在物理上却是重叠的 ; 所谓的重叠是指同一块内存区域可能被多个进程同时使用 , ...
- 共享内存实现进程间大数据的交换
引言 进程间的数据交换和共享是一种非常重要和实用的技术.大.中型软件的开发设计多是由众多程序设计人员的合作完成,通常一个程序设计人员只负责其中一个或几个模块的开发,这些模块可以是动态链接库也可以是应用 ...
- linux进程间通信:system V 信号量和共享内存实现进程间同步
关于信号量和共享内存的相关描述已经在前几篇提到过: 信号量:即内核维护的一个正整数,可以使用内核提供的p/v接口进行该正整数的+/-操作,它主要用来表示系统中可用资源的个数,协调各个进程有序访问资源, ...
- linux open 头文件_linux下通过共享内存和mmap实现进程间通讯
前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...
- linux mmap实例_Linux下通过共享内存和mmap实现进程间通讯(含实例)
前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...
- linux进程间通讯-共享内存
文章目录 共享内存概述 共享内存的特点 共享内存操作 在ubuntu 12.04中共享内存限制值如下 获得一个共享存储标识符 创建共享内存 共享内存映射(attach) 解除共享内存映射(detach ...
- Linux 进程间通讯详解一
进程间的通讯 两台主机间的进程通讯 --socket一台主机间的进程通讯 --管道(匿名管道,有名管道) --System V进程间通信(IPC)包括System V消息队列,System V信号量, ...
- linux进程间通讯的几种方式的特点和优缺点,和适用场合。
http://blog.csdn.net/kakaka2011/article/details/6636661 1. 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有 ...
- 删除共享内存_进程通信专题之 共享内存
什么是共享内存呢? 共享内存是被多个进程共享一部分物理内存,共享内存是进程间共享数据最快的办法,因为一个进程向共享内存中写了数据,那么共享的这个区域的所有进程就可以立刻看到这里的数据. 共享内存有什么 ...
最新文章
- 深度学习到底有哪些卷积?
- 超越对手pdf_如何创建一个超越竞争对手的移动应用
- 确定Java开发中.jar包的JDK版本
- HTML5原生拖拽/拖放 Drag Drop 详解
- Microsoft Dynamics CRM 2015 数据管理 之 如何批量导入数据到 正式区(二)系统自带示例数据 安装及教学...
- 《Pro Ogre 3D Programming》 读书笔记 之 第七章 资源管理(转)
- java ee 上传文件_17.《JavaEE 学习笔记》Servlet 上传文件
- 【图像处理】——上采样、下采样、在模板匹配中的金字塔加速策略
- unit类型是什么?_面试官虚晃一枪:项目中有用过锁吗?能解释一下什么是AQS?...
- java json.tostring,idea以JSON形式重写toString()方法
- 人工智能与机器学习的关系---人工智能工作笔记0013
- 2天玩转单反相机(第二讲)
- java如何向服务器传文件,详解Java向服务端发送文件的方法
- 计算机怎么获取权限删除文件,电脑删除文件需要获取trustedinstaller权限怎么回事...
- MFC实现窗口透明,并显示一张透明PNG图片
- 红外遥控及Android手机红外遥控器开发
- 常用商务邮箱:常用商务邮箱注册
- hadoop成功启动后,重新formatamp;nbs…
- android 分享纯图片到QQ空间实现方式
- 计算机开机f8键,开机F8键“高级启动选项”的秘密