通过boost :: interprocess :: message_queue传递指针

时间:2011-01-05 18:13:03

标签: boost message-queue interprocess

我要做的是让应用程序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中失效。我该如何做到这一点?

2 个答案:

答案 0 :(得分:0)

似乎您可以按照增强邮件列表中this post中的说明解决此问题。

答案 1 :(得分:0)

我同意这里有些尴尬,offset_ptr并不能真正满足您的需求。如果指针本身存储在另一个也在共享内存段中分配的类/结构中,则offset_ptr很有用,但是通常您有一些顶级项目,而不是共享内存中分配的某些对象的成员

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

您可以在发送时计算偏移量,将其发送,然后在接收端添加到基本地址中。如果您还希望发送nullptr,则可以像offset_ptr一样做,并同意1是一个不太可能被使用的偏移量,或者选择另一个不太可能的前哨值。