QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开
本文标题: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. 范例
偷个懒,写到一起了:
- #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了……
QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开的更多相关文章
- ACE框架 基于共享内存的进程间通讯
ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_ ...
- Android AIDL 进行进程间通讯(IPC)
编写AIDL文件时,需要注意: 1.接口名和aidl文件名相同. 2.接口和方法前不用加访问权限修饰符 (public.private.protected等,也不能用final.static). 3. ...
- High Performance Networking in Google Chrome 进程间通讯(IPC) 多进程资源加载
小结: 1. 小文件存储于一个文件中: 在内部,磁盘缓存(disk cache)实现了它自己的一组数据结构, 它们被存储在一个单独的缓存目录里.其中有索引文件(在浏览器启动时加载到内存中),数据文件( ...
- 进程间通讯IPC的几种方式总结
Linux进程间的通讯 Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同.前者对Unix早期的进程间通信 ...
- 服务 远程服务 AIDL 进程间通讯 IPC
Activity aidl接口文件 package com.bqt.aidlservice; interface IBinderInterface { /* 更改文件后缀为[.aidl]去掉 ...
- 服务 进程间通讯 IPC AIDL Parcelable 简介
1.IBinder和Binder是什么鬼? 我们来看看官方文档怎么说: 中文翻译: IBinder是远程对象的基本接口,是为了高性能而设计的轻量级远程调用机制的核心部分. 但他不仅用于远程调用,也用 ...
- 服务 远程服务 AIDL 进程间通讯 IPC 深化
示例 aidl接口文件 package com.bqt.aidlservice.aidl; parcelable Person; package com.bqt.aidlservice.aidl; ...
- Windows进程间通讯(IPC)----共享内存
Windows中同一个EXE文件多次加载过程 Windows中EXE文件加载是基于内存映射文件的. 当EXE文件第一次被加载. 首先系统会先创建一个进程内核对象,并创建一个新的进程地址空间. 系统调用 ...
- win32进程间通讯--共享内存
小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 hMa ...
随机推荐
- python学习之网络编程基础
引入场景:客户与银行关系 银行职员负责给客户提供取钱服务,客户通过账户密码跟银行职员建立合作关系.此时银行职员就可以作为服务器,当用户A取完钱后他需要等待下一个用户的接入,用户的账号密码就是建立合作关 ...
- ubuntu18 安装apache2.4 php5.6 mysql5.6
源码包下载: 链接:https://pan.baidu.com/s/1uoVMy_QNyR_zqVi06QPqKg 提取码:ll7s 注意: ubuntu安装:sudo apt-get inst ...
- 基于EasyX库的贪吃蛇游戏——C语言实现
接触编程有段时间了,一直想学习怎么去写个游戏来练练手.在看了B站上的教学终于可以自己试试怎么实现贪吃蛇这个游戏了.好了,废话不多说,我们来看看如何用EasyX库来实现贪吃蛇. 一.准备 工具vc++6 ...
- 嵌入式Linux 网络编程
涉及到的数据结构: 下面首先介绍两个重要的数据类型:sockaddr和sockaddr_in,这两个结构类型都是用来保存socket地址信息的 定义如下所示: struct sockaddr { un ...
- python学习笔记(三):numpy基础
Counter函数可以对列表中数据进行统计每一个有多少种 most_common(10)可以提取前十位 from collections import Counter a = ['q','q','w' ...
- 数据结构与算法之数组(1)——in dart
import 'dart:math' show Random; List<int> _array; final _rnd = Random(); final _capacity = 100 ...
- GD32F20x系列使用问题总结
GD单片机近几年越来越火了,既有他自身相比与ST的价格优势,也有支持国货的信仰加成.然而一个新的东西,或者说一个相对较新的东西,在使用的友好性和资料的完整性方面还有很长的路要走. 现将个人使用过程中碰 ...
- linux c makefile
unio : unio.c gcc unio.c -o unio run: ./unio 上面有错.必须强制按照规则来: 目标体:依赖文件 命令 命令必在目标体的下一行,且要加TAB键,必须必须. ...
- 2017-2018-1 20155338《信息安全技术》实验二——Windows口令破解
2017-2018-1 20155338<信息安全技术>实验二--Windows口令破解 一.试验环境 系统环境:Windows 实验工具: LC5 SuperDic 二.实验内容及要求 ...
- bootstrap 内边框样式
css设置: .table>tbody>tr>td, .table>tbody>tr>th, .table>tfoot>tr>td, .table ...