首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >共享内存在IPC通信中的应用

共享内存在IPC通信中的应用
EN

Stack Overflow用户
提问于 2014-08-28 10:17:53
回答 1查看 4.6K关注 0票数 3

我找不到一个足够的例子来说明如何使用apache来实现ipc--通过共享内存进行通信。我的目标是在节约的帮助下序列化一个存在的类,然后通过共享内存发送到另一个进程,在这个过程中,我将它重新反序列化。现在,我正在使用TMemoryBuffer和TBinaryProtocol来序列化数据。虽然这样做有效,但我不知道如何将它写入共享内存。

到目前为止,我的代码如下:

代码语言:javascript
复制
#include "test_types.h"
#include "test_constants.h"
#include "thrift/protocol/TBinaryProtocol.h"
#include "thrift/transport/TBufferTransports.h"

int main(int argc, char** argv)
{
    int shID;
    char* myPtr;
    Person* dieter = new Person("Dieter", "Neuer");
    //Person* johann = new Person("Johann", "Liebert");
    //Car* ford = new Car("KLENW", 4, 4);

    PersonThrift dieterThrift;
    dieterThrift.nachName = dieter->getNachname();
    dieterThrift.vorName = dieter->getVorname();

    boost::shared_ptr<apache::thrift::transport::TMemoryBuffer> transport(new apache::thrift::transport::TMemoryBuffer);
    boost::shared_ptr<apache::thrift::protocol::TBinaryProtocol> protocol(new apache::thrift::protocol::TBinaryProtocol(transport));

    test thriftTest;
    thriftTest.personSet.insert(dieterThrift);

    u_int32_t size = thriftTest.write(protocol.get());



    std::cout << transport.get()->getBufferAsString();

    shID = shmget(1000, 100, IPC_CREAT | 0666);
    if (shID >= 0)
    {
        myPtr = (char*)shmat(shID, 0, 0);

        if (myPtr==(char *)-1)
        {
            perror("shmat");
        }
        else
        {
            //myPtr = protocol.get();
        }
    }
    getchar();
    shmdt(myPtr);
}

主要问题是

代码语言:javascript
复制
//myPtr = protocol.get();

如何使用节约,以便将反序列化数据写入myPtr (从而写入共享内存)。我想TMemoryBuffer可能已经是个坏主意了。如你所见,我对此并不是很有经验。

事先表示亲切的问候和感谢。

迈克尔

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-01 12:07:43

再看一遍这个问题,仔细看看代码.你差点就到了。您所犯的错误是查看协议,它没有提供数据。相反,你必须问运输,就像你已经做的那样

代码语言:javascript
复制
std::cout << transport.get()->getBufferAsString();

获取原始数据的方法非常相似,只需使用getBuffer(&pbuf, &sz);即可。用这个,我们得到了这样的东西:

代码语言:javascript
复制
// query buffer pointer and data size
uint8_t* pbuf; 
uint32_t sz; 
transport.get()->getBuffer(&pbuf, &sz);

// alloc shmem blöock of adequate size
shID = shmget(1000, sz, IPC_CREAT | 0666);
if (shID >= 0)
{
    myPtr = (char*)shmat(shID, 0, 0);

    if (myPtr==(char *)-1)
    {
        perror("shmat");
    }
    else
    {
       // copy serialized data into shared memory
        memcpy( myPtr, pbuf, sz);  
    }
}

由于shmget()可能会给您提供比请求更大的块,因此额外使用框架传输似乎是个好主意,它自动携带序列化数据中的实际数据大小。后者的一些示例代码可以在测试客户端或服务器代码中找到。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25546348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档