【VS开发】内存映射文件进程间共享内存
内存映射文件进程间共享内存
内存映射文件的另一个功能是在进程间共享数据,它提供了不同进程共享内存的一个有效且简单的方法。后面的许多例子都要用到共享内存。
共享内存主要是通过映射机制实现的。
Windows 下进程的地址空间在逻辑上是相互隔离的,但在物理上却是重叠的。所谓的重叠是指同一块内存区域可能被多个进程同时使用。当调用CreateFileMapping 创建命名的内存映射文件对象时,Windows
 即在物理内存申请一块指定大小的内存区域,返回文件映射对象的句柄hMap。为了能够访问这块内存区域必须调用MapViewOfFile 函数,促使Windows 将此内存空间映射到进程的地址空间中。当在其他进程访问这块内存区域时,则必须使用OpenFileMapping
 函数取得对象句柄hMap,并调用MapViewOfFile 函数得到此内存空间的一个映射。这样一来,系统就把同一块内存区域映射到了不同进程的地址空间中,从而达到共享内存的目的。
下面举例说明如何将内存映射文件用于共享内存。
第一次运行这个例子时,它创建了共享内存,并写入数据“123456”。只要创建共享内存的进程没有关闭句柄hMap,以后运行的程序就会读出共享内存里面的数据,并打印出来。这就是使用共享内存在进程间通信的过程。程序代码如下。
- #include <Windows.h>
 - #include <stdlib.h>
 - #include <stdio.h>
 - void main() // 08ShareMem工程下
 - {
 - char szName[] = "08ShareMem"; // 内存映射对象的名称
 - char szData[] = "123456"; // 共享内存中的数据
 - LPVOID pBuffer; // 共享内存指针
 - // 首先试图打开一个命名的内存映射文件对象
 - HANDLE hMap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, szName);
 - if(hMap != NULL)
 - { // 打开成功,映射对象的一个视图,得到指向共享内存的指针,显示出里面的数据
 - pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
 - printf(" 读出共享内存数据:“%s”\n", (char*)pBuffer);
 - }
 - else
 - { // 打开失败,创建之
 - hMap = ::CreateFileMapping(
 - INVALID_HANDLE_VALUE,//无物理文件
 - NULL,
 - PAGE_READWRITE,
 - 0,
 - strlen(szData) + 1,
 - "08ShareMem");//起名字
 - // 映射对象的一个视图,得到指向共享内存的指针,设置里面的数据
 - pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
 - strcpy((char*)pBuffer, szData);
 - printf(" 写入共享内存数据:“%s”\n", (char*)pBuffer);
 - }
 - // 解除文件映射,关闭内存映射文件对象句柄
 - ::UnmapViewOfFile(pBuffer);
 - getchar(); // 注意,进程关闭后,所有句柄自动关闭,所以要在这里暂停
 - ::CloseHandle(hMap);
 - return;
 - }
 
打开两个进程发现结果如下:
1、写入共享内存数据: “123456”
2、读出共享内存数据: “123456”
【VS开发】内存映射文件进程间共享内存的更多相关文章
- C#  进程间共享内存通信方式
		
从别处看到一篇文章做进程间通信很好使,唯一的问题是,需要注意using的用法,Using有个用法3, using 语句允许程序员指定使用资源的对象应当何时释放资源.using 语句中使用的对象必须实现 ...
 - Windows进程间共享内存通信实例
		
Windows进程间共享内存通信实例 抄抄补补整出来 采用内存映射文件实现WIN32进程间的通讯:Windows中的内存映射文件的机制为我们高效地操作文件提供了一种途径,它允许我们在WIN32进程中保 ...
 - Swoole 中使用 Table 内存表实现进程间共享数据
		
背景 在多进程模式下进程之间的内存是相互隔离的,在一个工作进程中的全局变量和超全局变量,在另一个工作进程中是无法读取和操作的. 如果只有一个工作进程,则不存在进程隔离问题,可以使用全局变量和超全局变量 ...
 - linux 进程间共享内存示例
		
写入端: #include <iostream> #include <unistd.h> #include <stdlib.h> #include <stdi ...
 - C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转   VC中进程与进程之间共享内存     .net环境下跨进程、高频率读写数据  使用C#开发Android应用之WebApp  分布式事务之消息补偿解决方案
		
C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...
 - C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped  转
		
原文:C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing ...
 - C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped
		
节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). 内存映射文件对于托管世界的开发人员来说似乎很陌生,但它确实已经是很远古的技术了,而且在操作 ...
 - .NET 4.0中使用内存映射文件实现进程通讯
		
操作系统很早就开始使用内存映射文件(Memory Mapped File)来作为进程间的共享存储区,这是一种非常高效的进程通讯手段.Win32 API中也包含有创建内存映射文件的函数,然而,这些函数都 ...
 - 【VS开发】内存映射文件3
		
内存映射文件 内存映射文件,是由一个文件到一块内存的映射.Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping).内存映射文件与虚拟内存有些类似,通过内存映射文 ...
 
随机推荐
- MVC路由规则进一步了解
			
本周由于工作需要,接触了PetaPoco(一个小型的ORM-框架)和ExtJS,这个项目框架是别人写好的,用的是MVC,我写的MVC程序一般控制器和视图都是在一个类库下面的,但是作者是把MVC中的控制 ...
 - 001_项目开源之_STM32激光雕刻机
			
我是标题:STM32激光雕刻机(开源免费) (一)首先感谢将离九歌 https://github.com/MaxwellXyao 提供的C8T6/GRBL的源码 (二)本设计开源(免费),请忽倒 ...
 - Self install windows service in .NET c#
			
http://stackoverflow.com/questions/4144019/self-install-windows-service-in-net-c-sharp using System; ...
 - 请问如何上传带图片的word
			
Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法 ...
 - ueditor实现ctrl+v粘贴word图片并上传
			
图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码 目前限chrome浏览器使用,但是项目要求需要支持所有的浏览器,包括Windows和macOS系统.没有办 ...
 - socket编程和并发服务器
			
socket这个词可以表示很多概念: 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket. 在TCP协议中,建立连接的两个进程 ...
 - windows中命令行窗口提权到管理员权限.windows 的 sudo
			
命令行环境中获取管理员权限 第一种方法 (最爽,但是被运行的命令会被当成新进程运行,运行完成后就自动关闭了.) 把以下代码复制到记事本中保存为sudo.vbs 然后移动到PATH任意目录中,如wind ...
 - 存在日期类型的JSON数据,进行SpringMVC参数绑定时存在的问题和解决方案
			
这篇文章已经过时了. 请参考比较合适的前后端交互方式. 首先是发送AJAX请求的html页面 <!DOCTYPE html> <html> <head> <m ...
 - python的openpyxl的使用笔记
			
openpyxl模块介绍 openpyxl模块是一个读写Excel 2010文档的Python库,如果要处理更早格式的Excel文档,需要用到额外的库,openpyxl是一个比较综合的工具,能够同时读 ...
 - JavaWeb_(SpringMVC框架)测试SpringMVC&Spring&MyBatis三大整合
			
搭建 SpringMVC&Spring&MyBatis三大整合 传送门 1.准备 测试搭建S pringMVC&Spring&MyBatis三大整合 用例 a)准备 ...