3

我想要做的是让应用程序 A 向应用程序 B 发送指向 A 已在共享内存上分配的对象的指针(使用 boost::interprocess )。对于该指针传输,我打算使用boost::interprocess::message_queue. 显然,来自 A 的直接原始指针在 B 中无效,因此我尝试传输offset_ptr在共享内存上分配的内存。然而,这似乎也不起作用。

进程 A 这样做:

typedef offset_ptr<MyVector> MyVectorPtr;
MyVectorPtr * myvector;    
myvector = segment->construct<MyVectorPtr>( boost::interprocess::anonymous_instance )();

*myvector = segment->construct<MyVector>( boost::interprocess::anonymous_instance )
        (*alloc_inst_vec); ;

// myvector gets filled with data here

//Send on the message queue
mq->send(myvector, sizeof(MyVectorPtr), 0);

过程 B 这样做:

// Create a "buffer" on this side of the queue
MyVectorPtr * myvector; 
myvector = segment->construct<MyVectorPtr>( boost::interprocess::anonymous_instance )();
mq->receive( myvector, sizeof(MyVectorPtr), recvd_size, priority);

正如我所看到的,以这种方式对偏移量指针进行了一点复制,这使他在进程B中无效。我该怎么做呢?

4

2 回答 2

0

看来您可以按照 boost 邮件列表上的这篇文章中的描述解决它。

于 2011-01-06T00:34:02.717 回答
0

我同意这里有些尴尬,并且offset_ptr对于您要尝试做的事情并不真正起作用。offset_ptr如果指针本身存储在另一个类/结构中,该类/结构也分配在您的共享内存段中,则很有用,但通常您有一些顶级项目不是在共享内存中分配的某个对象的成员。

您会注意到offset_ptr 示例对此进行了掩饰——它只是有一个注释“与其他进程通信列表”,没有详细信息。在某些情况下,您可能有一个命名的顶级对象,并且该名称可以是您沟通它的方式,但如果您有任意数量的顶级对象进行沟通,它似乎只是从共享内存的基础发送偏移量地址是你能做的最好的。

您在发送端计算偏移量,发送它,然后添加到接收端的基地址。如果您也希望能够发送 nullptr,您可以像 offset_ptr 那样做并同意这1是一个不太可能使用的偏移量,或者选择另一个不太可能的哨兵值。

于 2019-07-15T16:58:16.923 回答