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学习:13.Python正则表达式
一.正则表达式简介 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. 就其本质 ...
- python教程(零)·前言
本教程是作者根据自己学习python的经验写下的,一来是想将经验分享给对python同样感兴趣的小白(大神请忽略),二来是想借此加深本人对python的理解,温故而知新. 学习基础 本教程面向的读者, ...
- coinmarketcap.com爬虫
coinmarketcap.com爬虫 写的真是蛋疼 # -*- coding:utf-8 -*- import requests from lxml import etree headers = { ...
- U盘装系统流程_U启动
步骤 (已有装机U盘的前提下,没有则参考U启动制作U盘启动盘详细教程) (这里默认已设置了相关开机设置,若没设置则参考怎么用u盘装win7系统(推荐看)中步骤11-13) 按开机键后,不断按F12(有 ...
- 一篇文章帮你梳理清楚API设计时需要考虑的几个关键点
本文作者是Enchant的架构师,他最近研究了Netflix.SoundCloud.谷歌.亚马逊.Spotify等公司的微服务实践,并根据自己的理解总结出了一套适用于现代Web和云技术的微服务实战经验 ...
- 【LG3243】[HNOI2015]菜肴制作
题面 洛谷 题解 首先我们有个非常显然的思路, 就是直接拓扑排序,用小根堆代替队列再按顺序输出,但是很显然是错的, 因为这只保证了字典序最小,而无法保证答案最优,\(<2,4>,<3 ...
- scala : 类型与类
scala类型系统:1) 类型与类 在Java里,一直到jdk1.5之前,我们说一个对象的类型(type),都与它的class是一一映射的,通过获取它们的class对象,比如 String.class ...
- C# webapi 路由规则和接收数据
1:新建的web api项目 默认的访问api方式: (get,post,delect,put) api+控制器 以Post为例子 post提交单个参数: 接收方法 post提交多个参数 接 ...
- sqlite两表更新update
1 2 3 4 5 6 7 8 9 10 11 12 UPDATE t1 SET Column1 = ( SELECT Columnx FROM t2 WHERE t2. KEY = ...
- Java 分割、合并byte数组
场景:上传文件较大,把存放文件内容byte数组拆分成小的.下载的时候按照顺序合并. 起初觉得挺麻烦的,写完觉得挺简单. 切割: /** * 拆分byte数组 * * @param bytes * 要拆 ...