首页
社区
课程
招聘
[原创]内存映射文件-进程间共享数据
发表于: 2019-10-20 16:23 11499

[原创]内存映射文件-进程间共享数据

2019-10-20 16:23
11499

       内存映射文件保留了一个地址空间区域,在需要的时候将他提交的物理存储器,他们之间的不同点是内存映射文件提交到物理存储器的数据来自磁盘上相应的文件,而不是系统页文件。一旦文件被映射,就可以认为整个文件被加载到了内存中,可以像访问内存一样访问文件的内容。可以使用内存映射来访问磁盘上的数据,还可以用内存映射文件实现多个进程间共享数据。

       内存映射文件相关的函数包括,CreateFileMapping(),OpenFileMapping(),MapViewOfFile(),UnmapViewOfFile,FlushViewOfFile().

       windows下进程的地址空间在逻辑上是相互隔离的,但在物理上却是重叠的。所谓重叠是指同一内存区域可能被多个进程同时使用。当使用CreateFileMapping创建命名的内存映射文件对象的时候,window即在物理内存申请一块大小指定的内存区域,返回文件映射对象的句柄hMap.为了能够访问这块内存区域必须调用MapViewOfFile()函数,促使Windows将此内存空间映射到进程的内存空间当中。当在其他进程访问这块内存区域的时候,则必须使用OpenFileMapping函数取得对应的句柄,并调用MapViewOfFile()函数得到此内存空间的一个映射。这样一来,系统就把同一块内存映射到了不同进程的地址空间中,达到了共享内存共享的目的。

下面的代码简单的实现了共享内存在进程间通信的过程。


在命令行窗口运行同一个程序两次,getchar()的作用是使程序处于挂起状态



HANDLE WINAPI CreateFileMapping(
_In_HANDLE hFile,                               //一个文件句柄,为-1的时候标识建立共享内存
_In_opt_LPSECURITY_ATTRIBUTES lpAttributes,     //定义该内存映像是否可以继承
_In_DWORD flProtect,                            //该内存映像的保护类型PAGE_READONLY 或PAGE_READWRITE
_In_DWORD dwMaximumSizeHigh,                    //内存映射文件的大小
_In_DWORD dwMaximumSizeLow,
_In_opt_LPCTSTR lpName                          //内存映射文件的名字
);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-10-21 11:30 被wwzzww编辑 ,原因:
收藏
免费 10
支持
分享
最新回复 (7)
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
2
好文,之前看别的文章一直没看懂原理。楼主几句话就讲清了
2019-10-20 17:32
0
雪    币: 4034
活跃值: (3883)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
相当于黑板了 大家都可以看到
2019-10-20 21:36
0
雪    币: 100
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看完就明白许多了
2019-10-21 11:21
0
雪    币: 96
活跃值: (225)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看完就明白许多了
2019-10-21 13:36
0
雪    币: 200
活跃值: (565)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
看完就明白许多了
2019-10-22 21:40
0
雪    币: 1670
活跃值: (1975)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
有没有监控进程读取共享内存的方式
2023-2-10 15:42
0
雪    币: 233
活跃值: (162)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
补充自己遇到的坑,读写映射后内存,最好加上异常处理,有很小的概率可能出现page- io error,导致crash,可以参考下官方代码
2023-5-1 12:27
0
游客
登录 | 注册 方可回帖
返回
//