进程间的数据共享

//========================================================================
//TITLE:
//    进程间的数据共享
//AUTHOR:
//    norains
//DATE:
//    Friday  20-June-2008
//Environment:
//    WINCE5.0 + VS2005 + MIPS SDK
//========================================================================

    同一进程的不同线程间共享数据不是难事,并且方式也很多,不胜枚举;而不同的进程间需要共享数据,虽然方法不多,但却也颇有成效。
   
    其实不同进程间的数据共享很简单,只需要调用CreateFileMapping和MapViewOfFile即可。CreateFileMapping创建或获取一个内存文件句柄,而MapViewOfFile则是获取文件句柄的存储内存的起始地址。
   
    假设有两个程序,程序A负责设置数据,程序B负责读取,则简单的程序例子可以如下:
   
    程序A:

#include "windows.h"
#include "vector"

#define MEM_SIZE 0x1000000
#define MEM_SHARE_NAME TEXT("bobo")

int WINAPI WinMain( HINSTANCE hInstance,
     HINSTANCE hPrevInstance,
     LPTSTR    lpCmdLine,
     int       nCmdShow)
{
  //创建或获取内存文件句柄
 HANDLE hFile = CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,MEM_SIZE,MEM_SHARE_NAME);
 VOID * pMem = NULL;
 if(hFile != NULL)
 {
  //获取存储的内存地址
  pMem = MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0);

  //设置数据
  std::vector<char> vtStr;
  vtStr.push_back(&apos;T&apos;);
  vtStr.push_back(&apos;E&apos;);
  vtStr.push_back(&apos;S&apos;);
  vtStr.push_back(&apos;T&apos;);
  vtStr.push_back(0);
  
  memcpy(pMem,&vtStr[0],vtStr.size());
 }

 //如果不再使用,应该关闭句柄
 //CloseHandle(hFile);
 
 return 0;
}


    程序B:

#include "windows.h"
#include "vector"

#define MEM_SIZE 0x1000000
#define MEM_SHARE_NAME TEXT("bobo")

int WINAPI WinMain( HINSTANCE hInstance,
     HINSTANCE hPrevInstance,
     LPTSTR    lpCmdLine,
     int       nCmdShow)
{
 HANDLE hFile = CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0,MEM_SIZE,MEM_SHARE_NAME);
 VOID * pMem = NULL;
 if(hFile != NULL)
 {
  pMem = MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,0);

  //读取数据
  std::vector<char> vtStr(6,0);
  memcpy(&vtStr[0],pMem,vtStr.size());
 }

 //如果不再使用,应该关闭句柄
 //CloseHandle(hFile);
 
 return 0;
}


    这两个程序片段很简单,为了说明方便,并没有用到信号量同步。两个程序间之所以能够读取相同的内存地址,主要是调用CreateFileMapping函数时的尾参数都是一致的,因此获取的内存文件句柄都是指向同一个,最后根据该句柄获取的内存存储地址才是一致,故达到了不同进程间共享数据的目的。

转载于:https://www.cnblogs.com/wodeyitian/archive/2008/07/16/2460419.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463822.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Silverlight实用窍门系列:63.Silverlight中的Command,自定义简单Command

在Silverlight中的MVVM模式下将前台页面和ViewModel界面交互分离开是通过本节所要讲述的Command实现的。我们自定义一个Command需要继承于ICommand接口并且实现这个接口。它有CanExecute()、Execute()方法和CanExecuteChanged事件组成。 CanExecute()&#xff1a;判断是否继续执…

赋值运算符和拷贝构造函数的区别与联系

转载&#xff1a;http://blog.csdn.net/hebbely/article/details/65437510 简述&#xff1a; C中一般创建对象&#xff0c;拷贝或赋值的方式有构造函数&#xff0c;拷贝构造函数&#xff0c;赋值函数这三种方法。拷贝构造函数使用已有的对象创建一个新的对象&#xff0c;赋值运…

硬件有没有35岁危机?

大家好&#xff0c;我篇文章是我的朋友记得诚写的&#xff0c;分享给大家&#xff01;35岁危机指的是&#xff0c;很多企业停止招聘35岁及以上的员工&#xff0c;甚至会裁掉年纪大的人。我们经常说程序员&#xff0c;说互联网从业者有35岁危机。这个危机一方面是自己的焦虑&…

深入理解ES6之迭代器与生成器

迭代器 迭代器 iterator&#xff0c;在 Javascript 中&#xff0c;迭代器是一个对象&#xff08;也可称作为迭代器对象&#xff09;&#xff0c;它提供了一个 next() 方法&#xff0c;用来返回迭代序列中的下一项。 next 方法的定义&#xff0c;next 方法是一个函数&#xff0c…

强大的独立日期选择器(date picker)插件 - Kalendae

日期&#xff1a;2012-4-16 来源&#xff1a;GBin1.com 在线演示 本地下载 今天分享一个独立的日期选择插件Kalendae&#xff0c;Kalendae是 一个强大健壮的独立日期选择器。如果你不想使用重量的jQuery UI类库的话&#xff0c;这个插件肯定是一个不错的备选。Kalendae包含了…

35家名企嵌入式/软件秋招岗位等你来!

大家好&#xff0c;我是写代码的篮球球痴。前两天一个小伙伴在微信让我帮忙推荐嵌入式招聘岗位。我实话实说&#xff0c;是有认识的人让我推荐简历的&#xff0c;但是相对于专业的招聘网站&#xff0c;我手里能拿出来的岗位实在是少之又少&#xff0c;专业的招聘网站会对不同的…

javascript实现平滑的锚点

转到源文件 转载于:https://www.cnblogs.com/flat_peach/archive/2008/07/22/1248653.html

Windows下窗口的生命周期

程序的执行 当执行Windows程序的时候&#xff0c;加载器加载该程序&#xff0c;然后调用C startup code&#xff0c;再调用程序中WinMain()。 初始化 WinMain函数首先通过CreateWindow函数创建窗口&#xff0c;并对窗口进行初始化配置; 消息的处理 程序通过循环GetMessage函数不…

尝试梳理下ARM处理器的发展历史

大家好&#xff0c;这篇文章是我的朋友Michael Yao写的&#xff0c;我觉得非常不错&#xff0c;分享给大家。1. 前言本文尝试简单梳理下ARM处理器的发展历史、架构的演进&#xff0c;包括不同处理器的应用方向&#xff0c;但我们重点还是围绕Cortex-A系列展开&#xff0c;也会介…

linux下的CPU、内存、IO、网络的压力测试

一、对CPU进行简单测试&#xff1a; 1、通过bc命令计算特别函数 例&#xff1a;计算圆周率 echo "scale5000; 4*a(1)" | bc -l -q MATH LIBRARY If bc is invoked with the -l option, a math library is preloaded and the default scale is set to 20.…

清空sql server日志

1、打开查询分析器&#xff0c;输入命令DUMP TRANSACTION 数据库名 WITH NO_LOG2、打开企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至: ,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了。3、在数…

find与grep的区别

find 功能&#xff1a;在目录结构中搜索文件&#xff0c;并执行指定的操作。此命令提供了相当多的查找条件&#xff0c;功能很强大。 语法: find 查找位置 匹配文件名 说明&#xff1a;find命令从指定的起始目录开始&#xff0c;递归地搜索其各个子目录&#xff0c;查找满足寻…

给你这张图,你能搜索到来历吗

如果我们想让搜索引擎帮我们找到这张图的来历&#xff0c;可能吗&#xff1f; 这是目前搜索引擎做不到的。如果能做到呢&#xff1f; 转载于:https://www.cnblogs.com/shangge/archive/2008/07/23/1249767.html

晚上读内核代码

最近因为要解决一个bug&#xff0c;需要在内核的f_hid.c里面做一些适配&#xff0c;需要把这部分代码研究透彻。在这几天之前我是根本不知道什么是In端点&#xff0c;Out端点&#xff0c;以及什么是endpoint 0的&#xff0c;而且最近的一段时间&#xff0c;我一直是在写应用方面…

我的家庭私有云计划-16

嗯&#xff0c;上午测试S2S的稳定性&#xff0c;改掉几个bug。还挺忙的。这会儿让机器跑测试去&#xff0c;腾出点时间&#xff0c;我们接着聊。 呵呵&#xff0c;昨天哪&#xff0c;已经有朋友批评我了&#xff0c;说我有点贪大求全&#xff0c;这个论坛什么的没必要自己实现&…

采用存储复制方式同步数据,实现数据库安全升级

2017年年初&#xff0c;海天起点为某省中行机房搬迁工作保驾护航。在机房搬迁过程中发现有多套数据库需要升级到11g&#xff0c;但由于有些数据库比较老旧&#xff0c;升级过程不能一次性完成&#xff0c;需要先升级到一个中间版本&#xff0c;再升级到最终目标版本。 但由于银…

【转】娱乐八卦——关于孙悟空的授业师傅的分析

一&#xff0e;《西游记》和《封神演义》联系密切  提起明朝著作《西游记》和《封神演义》&#xff0c;我想你一定不会陌生。从两部作品中派生出来的《孙悟空大闹天宫》、《哪吒闹海》等神话就更是家喻户晓&#xff0c;人人皆知了。两部小说虽然讲述的是不同朝代的故事&#…

为啥要xargs

转载&#xff1a;http://blog.csdn.net/yhcharles/article/details/44875865 为啥要xargs? 通常linux命令可以用|首尾相连&#xff0c;上一个命令的 stdout 连接到下一个命令的 stdin。但是有些命令&#xff0c;比如ls、rm等&#xff0c;是从命令行参数接受输入的。这时候如果…

Linux进程调度与性能优化 | 真货

作者简介&#xff1a;张毅峰&#xff0c;某主机厂架构师。一、eBPF安全可观测性的前景展望本次分享将从监控和可观测性、eBPF安全可观测性分析、内核安全可观测性展望三个方面展开。1.监控(Monitoring)vs可观测性(Observability)从上图可以看到&#xff0c;监控只是可观测性的冰…

教师生涯由此开始

招聘会时间&#xff1a;2012-03-28 09:00 招聘会地址&#xff1a;就业办507 为加强教师队伍建设&#xff0c;建设教育强县&#xff0c;经研究&#xff0c;我县决定面向全国“985”、“211”工程高等师范院校应届毕业生选聘普通高中和初中教师38名。现将有关事项公告如下&#x…