我已阅读关于内存映射文件的文章和有关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()
将整型转换为void *
使堆栈指针指向一个mmap返回的指针。 (Linux,32位虚拟机)
我如何使用基地址来获得dynamic?
何时返回E_POINTER和何时E_INVALIDARG?
Linux内核代码中的“current”
传递结构指针与传递结构
Windows C ++ – 在类中创build窗口使其看起来很不寻常
从CArray指针访问值
从库中查找argc和argv
代码在Windows中工作,但不在Linux中! 为什么?
正如其他答案已经说过,您必须依靠内存映射区域的地址相等,或者您必须从您的指针中的绝对地址移动到相对寻址。
我最近偶然发现的一个可能的实现是Boost库中的offset_ptr ,它看起来很适合你的用例。
答案取决于你想达到什么。 在共享内存中传递指针很容易,但其他进程可能无法以您期望的方式使用它。
请注意,指针包含它指向的数据结构的虚拟地址。 这种虚拟地址只在保存指向数据结构的进程中有效。 如果将指针传递给另一个进程,则另一个进程将拥有自己的虚拟地址空间,并且传递的指针将失去其有效性。
所以你的问题的答案是:是的,你可以通过指针,但没有进一步的行动,你将无法在接收过程中成功使用这个指针。 具体来说,你很可能无法使用它来访问它指向的结构或对象。
如果要访问其他进程中的结构或对象,则需要执行以下操作:
将对象本身放入共享内存。
将指针转换为相对于内存映射文件开始位置的偏移量。
将此偏移量传递给其他进程
在另一个进程中,使用偏移量转换回指针。
boost::offset_ptr可以帮助你的一部分。
假设指针是一个结构,是同一个内存映射区域的一部分,是的,这是有道理的。 但是你必须确保内存映射区域映射到相同的虚拟地址,但这并不总是有保证的,而且是设计事物的不好的方法。
您可以传递偏移量,并处理存在于此内存区域中各处的相对偏移量。
如果要传入内存映射文件的指针不是由GlobalAlloc分配的,也不是由GlobalLock锁定的,则不能。 但是,您已经分配了用于传递数据的内存。 所以你可以重写内存映射文件中的内存。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。