我可以使用内存映射文件传递指针吗?

时间:2017-06-30 09:32:13

标签: c++ linux windows pointers ipc

我已阅读有关Memory-Mapped Files的文章和有关CreateFileMapping的示例 我的问题是:我可以使用内存映射文件将指针传递给两个进程之间的结构或对象吗?


由于有一些答案是可能的,这里是我想传递的结构:

// First Process
struct OtherStruct{};

struct MyStruct
{
    unsigned long       handleObject;
    unsigned long       *phandleObject;
    OtherStruct         someData;
    OtherStruct         *pData;
}

MyStruct dataSend = { ... };
WriteToMappedFile(data);

// Second Process
MyStruct dataReceived = ReadFromMappedFile()

4 个答案:

答案 0 :(得分:3)

正如其他答案已经陈述的那样,你必须要么依赖于内存映射区域的地址,要么必须从指针中的绝对地址移动到相对寻址。

我最近偶然发现的一个可能的实现是Boost库中的offset_ptr,它似乎完全适合您的用例。

答案 1 :(得分:2)

答案取决于你想要达到的目标。在共享内存中传递指针很容易,但是其他进程可能无法以您期望的方式使用它。

请注意,指针包含它指向的数据结构的虚拟地址。这样的虚拟地址仅在保存指向数据结构的进程内有效。如果将指针传递给另一个进程,则另一个进程将拥有自己的虚拟地址空间,并且传递的指针将失去其有效性。

所以问题的答案是:是的,您可以传递指针,但如果没有进一步的操作,您将无法在接收过程中成功使用此指针。具体来说,您很可能无法使用它来访问它指向的结构或对象。

如果要访问其他进程中的结构或对象,则需要执行以下操作:

  • 将对象本身放入共享内存。
  • 将指向对象的指针转换为相对于内存映射文件开头的偏移量。
  • 将此偏移传递给其他进程
  • 在另一个过程中,使用偏移量转换回指针。

boost::offset_ptr可以帮助您解决部分问题。

答案 2 :(得分:0)

假设Pointer是一个结构,它是同一个内存映射区域的一部分,是的,这是有意义的。但是你必须确保内存映射区域映射到同一个虚拟地址,这并不总能得到保证,并且是一种糟糕的设计方法。

您可以传递偏移量,并处理此内存区域中存在的fpor结构的相对偏移量。

答案 3 :(得分:0)

如果要传递给内存映射文件的指针未由GlobalAlloc分配,并且未被GlobalLock锁定,则它不能。但是,你已经有了内存分配来传递数据。所以你可以在内存映射文件上重写内存。