我可以使用内存映射文件传递指针吗?
Can I pass a pointer using memory mapped files?
我已阅读有关 Memory-Mapped Files and the example about 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()
假设指针指向属于同一内存映射区域的结构,是的,这是有道理的。但是你必须确保内存映射区域映射到相同的虚拟地址,这并不总是保证并且是一种糟糕的设计方式。
您可以改为传递偏移量,并处理此内存区域中存在的 fpor 结构各处的相对偏移量。
如果您要传递到内存映射文件的指针不是由 GlobalAlloc 分配的,也没有被 GlobalLock 锁定,则不能。 但是,您有已经分配用于传递数据的内存。所以你可以重写内存映射文件上的内存。
如其他答案所述,您必须依赖内存映射区域的地址相等,或者您必须从指针中的绝对地址转移到相对寻址。
我最近偶然发现的一个可能的实现是 Boost 库中的 offset_ptr,它似乎非常适合您的用例。
答案取决于您想要实现的目标。在共享内存中传递指针很容易,但其他进程可能无法以您期望的方式使用它。
请注意,指针包含它指向的数据结构的虚拟地址。这样的虚拟地址仅在持有指向的数据结构的进程内有效。如果将指针传递给另一个进程,另一个进程将拥有自己的虚拟地址space,传递的指针将失去有效性。
所以你的问题的答案是:是的,你可以传递指针,但是如果不进一步操作,你将无法在接收过程中成功使用这个指针。具体来说,您很可能无法使用它来访问它指向的结构或对象。
如果要在其他进程中访问结构或对象,需要执行以下操作:
- 将对象本身放入共享内存。
- 将指向对象的指针转换为相对于内存映射文件开头的偏移量。
- 将此偏移量传递给其他进程
- 在另一个进程中,使用偏移量转换回指针。
boost::offset_ptr
可以帮助您完成其中的一部分。
我已阅读有关 Memory-Mapped Files and the example about 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()
假设指针指向属于同一内存映射区域的结构,是的,这是有道理的。但是你必须确保内存映射区域映射到相同的虚拟地址,这并不总是保证并且是一种糟糕的设计方式。
您可以改为传递偏移量,并处理此内存区域中存在的 fpor 结构各处的相对偏移量。
如果您要传递到内存映射文件的指针不是由 GlobalAlloc 分配的,也没有被 GlobalLock 锁定,则不能。 但是,您有已经分配用于传递数据的内存。所以你可以重写内存映射文件上的内存。
如其他答案所述,您必须依赖内存映射区域的地址相等,或者您必须从指针中的绝对地址转移到相对寻址。
我最近偶然发现的一个可能的实现是 Boost 库中的 offset_ptr,它似乎非常适合您的用例。
答案取决于您想要实现的目标。在共享内存中传递指针很容易,但其他进程可能无法以您期望的方式使用它。
请注意,指针包含它指向的数据结构的虚拟地址。这样的虚拟地址仅在持有指向的数据结构的进程内有效。如果将指针传递给另一个进程,另一个进程将拥有自己的虚拟地址space,传递的指针将失去有效性。
所以你的问题的答案是:是的,你可以传递指针,但是如果不进一步操作,你将无法在接收过程中成功使用这个指针。具体来说,您很可能无法使用它来访问它指向的结构或对象。
如果要在其他进程中访问结构或对象,需要执行以下操作:
- 将对象本身放入共享内存。
- 将指向对象的指针转换为相对于内存映射文件开头的偏移量。
- 将此偏移量传递给其他进程
- 在另一个进程中,使用偏移量转换回指针。
boost::offset_ptr
可以帮助您完成其中的一部分。