【问题标题】:MapViewOfFile returns different addresses with same handleMapViewOfFile 返回具有相同句柄的不同地址
【发布时间】:2018-02-20 11:52:37
【问题描述】:

我正在尝试通过共享内存来为学校作业实施 IPC。 我创建了一个名为SharedMemoryBuffer 的类来处理创建文件映射和视图。

我的Init() 函数如下所示:

BYTE * SharedMemoryBuffer::Init(const wchar_t * name, size_t bufferSize)
{

    FileMapHandle = OpenFileMapping(
        FILE_MAP_ALL_ACCESS,   // read/write access
        FALSE,                 // do not inherit the name
        name);               // name of mapping object

    if (FileMapHandle == NULL)
    {
        FileMapHandle =
            CreateFileMapping(INVALID_HANDLE_VALUE,
                NULL,
                PAGE_READWRITE,
                0,
                bufferSize,
                name);

        pBuf = (BYTE*)MapViewOfFile(FileMapHandle, // handle to map object
            FILE_MAP_ALL_ACCESS,  // read/write permission
            0,
            0,
            bufferSize);
    }
    else
    {
        pBuf = (BYTE*)MapViewOfFile(
            FileMapHandle,
            FILE_MAP_ALL_ACCESS,
            0,
            0,
            bufferSize
        );
    }
    return this->GetBuffer();
}

本质上,我向它传递了一个名称和大小,它会尝试使用这个名称打开一个映射。如果失败,则改为创建它。

我这样称呼它 this->ringBuffer.Init(widestr.c_str(), buffSize);

完成此操作后(我从同一个进程对 2 个缓冲区调用 Init 4 次)我打印出缓冲区的地址(Init() 中的pBuf)但它们都是不同的地址。

为了我的生命,我无法弄清楚为什么地址会不同! 我确保第二次调用Init() 时,它确实成功打开了文件映射。

来源:https://github.com/RavioliFinoli/SharedMemory

【问题讨论】:

  • 对我来说更重要的问题似乎是:如果您在同一个进程中使用此共享内存,尽管缓冲区地址不同,但内存共享是否有效?
  • 什么是pBufFileMapHandle 是什么?你如何检查地址?您可以尝试创建一个Minimal, Complete, and Verifiable Example 向我们展示吗?为什么你希望每次调用返回的地址都是一样的?
  • 而您确实了解virtual memory 的工作原理吗?您可以将多个地址都映射到同一个物理内存?
  • @Someprogrammerdude 好吧,我想我确实知道虚拟内存是如何工作的。我检查pBuf 指针的原因是我尝试从缓冲区添加和接收数据但得到了垃圾,但我想问题出在其他地方。我的印象是MapViewOfFile 返回的指针将指向缓冲区所在的物理内存,这就是为什么当指针不同时我认为有问题的原因。
  • @Someprogrammerdude 有没有办法验证这些地址是否映射到相同的物理内存?

标签: c++ ipc


【解决方案1】:

您在流程中两次映射同一区域。您将获得两个不同的地址,但它们由相同的物理内存支持。写入第一个地址指向的缓冲区会修改第二个地址指向的缓冲区,因为它们实际上是同一块内存。

【讨论】:

    猜你喜欢
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 2012-05-26
    • 2011-09-09
    相关资源
    最近更新 更多