Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过boost::进程间::消息队列传输指针_Boost_Message Queue_Interprocess - Fatal编程技术网

通过boost::进程间::消息队列传输指针

通过boost::进程间::消息队列传输指针,boost,message-queue,interprocess,Boost,Message Queue,Interprocess,我试图让应用程序A向应用程序B发送一个指针,指向A在共享内存上分配的对象(使用boost::interprocess)。对于指针传输,我打算使用boost::进程间::消息队列。显然,来自a的直接原始指针在B中无效,因此我尝试传输在共享内存上分配的偏移量\u ptr。然而,这似乎也不起作用 流程A执行以下操作: typedef offset_ptr<MyVector> MyVectorPtr; MyVectorPtr * myvector; myvector = segmen

我试图让应用程序A向应用程序B发送一个指针,指向A在共享内存上分配的对象(使用boost::interprocess)。对于指针传输,我打算使用
boost::进程间::消息队列
。显然,来自a的直接原始指针在B中无效,因此我尝试传输在共享内存上分配的
偏移量\u 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);
// 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);
typedef offset_ptr MyVectorPtr;
MyVectorPtr*myvector;
myvector=segment->construct(boost::进程间::匿名_实例)();
*myvector=段->构造(boost::进程间::匿名\u实例)
(*alloc_inst_vec);
//myvector在这里填充数据
//在消息队列上发送
mq->send(myvector,sizeof(MyVectorPtr),0);
流程B执行以下操作:

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);
// 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);
//在队列的这一侧创建一个“缓冲区”
MyVectorPtr*myvector;
myvector=segment->construct(boost::进程间::匿名_实例)();
mq->receive(myvector,sizeof(MyVectorPtr),recvd_size,priority);

在我看来,用这种方式a复制一个偏移指针,这会使他在进程B中失效。我怎么做才能正确呢?

看起来你可以按照boost邮件列表中的描述来解决它。

我同意这里有一些尴尬,而且
偏移量ptr
对你正在尝试的工作并不起作用<如果指针本身存储在另一个类/结构中(该类/结构也分配在共享内存段中),则代码>偏移量ptr非常有用,但通常您有一些顶级项,而这些顶级项不是分配在共享内存中的某个对象的成员

你会注意到这上面有点遮掩——它只是有一个注释“与其他进程通信列表”,没有任何细节。在某些情况下,您可能有一个命名的顶级对象,并且该名称可以是您通信它的方式,但是如果您有任意数量的顶级对象要通信,那么您最好只发送来自共享内存基址的偏移量

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