C++ 内存映射文件,保护单个视图不被覆盖

C++ 内存映射文件,保护单个视图不被覆盖,c++,winapi,memory-mapped-files,C++,Winapi,Memory Mapped Files,是否可以保护视图(pMap、pMap2)数据不被彼此覆盖 或者我需要手动操作 例如,当我执行代码时,文件数据将全部为“1” 源代码 #include <Windows.h> #include <iostream> using namespace std; int main() { SYSTEM_INFO systemInfo; GetSystemInfo(&systemInfo); HANDLE hFile = CreateFile(

是否可以保护视图(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;
    }
    
    #包括
    #包括
    使用名称空间std;
    int main()
    {
    系统信息系统信息;
    GetSystemInfo(&systemInfo);
    HANDLE hFile=CreateFile(“temp”,泛型执行,泛型读,泛型写,0,0,总是创建,文件属性,0);
    //错误检查
    HANDLE hMap=CreateFileMapping(hFile,NULL,PAGE_EXECUTE_READWRITE,0,systemInfo.dwAllocationGranularity*2,“awMapMemory”);
    //错误检查
    LPVOID pMap=MapViewOfFile(hMap,文件映射读取,文件映射写入,0,0,systemInfo.dwAllocationGranularity);
    LPVOID pMap2=MapViewOfFile(hMap,文件映射读取,文件映射写入,0,systemInfo.dwAllocationGranularity,systemInfo.dwAllocationGranularity);
    //错误检查
    __试一试
    {
    for(int i=0;i
    现代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包含相同的指针时相同。

    它们如何相互覆盖?我不理解你的问题。MapViewOfFIle的目的是在不同进程之间共享内存。你到底想实现什么?我想用这个方法来存储大量的数据结构(3d坐标、颜色、类型…)。假设视图地址是pMap=0和pMap2=10,如果我将11个字节写入地址pMap,我将首先写入pMap2。或者我不理解MapViewOfFile的意义?@Michael
    MapViewOfFile
    的目的是将文件对象的特定区域映射到进程的地址空间。它可以用于IPC,但肯定不限于这种情况。@alviduxxx:是的,可能您误解了MapViewOfFile的意义。您的小程序显示的行为是正常的。