我正在尝试通过共享内存来实现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);
完成此操作后(我从同一个进程调用Init 4次2个缓冲区)我打印出缓冲区的地址(pBuf
来自Init()
),但它们都是不同的地址。 / p>
我无法对生命的热爱弄清楚为什么地址会有所不同!
我已经确定第二次使用相同名称调用Init()
,确实可以成功打开文件映射。
答案 0 :(得分:1)
您在流程中将同一区域映射两次。您将获得两个不同的地址,但它们由相同的物理内存支持。写入第一个地址指向的缓冲区会修改第二个地址指向的缓冲区,因为它们实际上是相同的内存。