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