内存映射文件,保护单个视图不被覆盖
Memory-Mapped Files, protecting individual view from overriding
-
是否可以保护视图(pMap,pMap2)数据不相互覆盖?
-
还是我需要手动完成?
例如,当我执行代码时,文件数据将全部为"1"。
源代码
#include <Windows.h>
#include <iostream>
using namespace std;
int main()
{
SYSTEM_INFO systemInfo;
GetSystemInfo(&systemInfo);
HANDLE hFile = CreateFile("temp", GENERIC_EXECUTE | GENERIC_READ | GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
// error check
HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_EXECUTE_READWRITE, 0, systemInfo.dwAllocationGranularity*2, "awMapMemory");
// error check
LPVOID pMap = MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, systemInfo.dwAllocationGranularity);
LPVOID pMap2 = MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, systemInfo.dwAllocationGranularity, systemInfo.dwAllocationGranularity);
// error check
__try
{
for(int i = 0; i < systemInfo.dwAllocationGranularity; i++)
*((char*)pMap2 + i) = 2;
for(int i = 0; i < systemInfo.dwAllocationGranularity + systemInfo.dwAllocationGranularity; i++)
*((char*)pMap + i) = 1;
FlushViewOfFile(pMap, 0);
}
__except (GetExceptionCode() == EXCEPTION_IN_PAGE_ERROR ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
// error
}
UnmapViewOfFile(pMap);
CloseHandle(hMap);
CloseHandle(hFile);
return 0;
}
现代CPU有一个MMU。此设备将程序看到的地址转换为硬件看到的地址。
示例:MMU 可以以 (char *)0x1000 实际访问地址0x12345000而不是0x1000的方式进行编程。
以这种方式使用 MMU 对于现代操作系统的内存管理绝对是必不可少的!
当你以你的方式使用MapViewOfFile时,MMU将被编程为pMap和pMap2转换为相同的硬件地址。举个例子:
pMap = (char *)0x1000 -> Hardware address 0x12345000
pMap2 = (char *)0x2000 -> Also hardware address 0x12345000
这意味着 pMap 和 pMap2 实际上指向同一个地址(这里0x12345000)。因此,程序的行为方式必须与 pMap 和 pMap2 包含相同的指针相同。
相关文章:
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 视图中的参数推导失败:take_while
- 使用ios:ate写入到流会覆盖现有文件
- 如何维护资源管理器项目视图中当前可见的项目列表
- 我可以重新分配/覆盖std::字符串吗
- 叮叮当当在修复时插入多个"覆盖"说明符
- 谷歌模拟和覆盖关键字
- 在另一个类视图中添加最多2个图表的正确方法是什么
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- OpenVR:向视图方向移动
- 使用 WIN32 API (C/C++) 对特定树视图项进行着色
- 将所选值(通过视图)从 boost::multi_array 复制到另一个数组 (C++)
- 使用子类覆盖基类中定义的函数
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 如何在不使用滚动条的情况下使视图更改
- C++指针在 for 循环中被覆盖
- 列表视图更改选择颜色
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- 内存映射文件,保护单个视图不被覆盖