使用 Thrift 通过共享内存进行 IPC 通信

2024-04-17

我找不到关于如何使用 apache thrift 通过共享内存进行 ipc 通信的足够示例。我的目标是在 thrift 的帮助下序列化现有的类,然后通过共享内存发送到另一个进程,在该进程中我在 thrift 的帮助下再次反序列化它。现在我正在使用 TMemoryBuffer 和 TBinaryProtocol 来序列化数据。虽然这有效,但我不知道如何将其写入共享内存。

到目前为止,这是我的代码:

#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);
}

主要问题是零件

//myPtr = protocol.get();

如何使用 thrift 以便将反序列化数据写入 myPtr(从而写入共享内存)。我想 TMemoryBuffer 可能已经是一个坏主意了。正如你所看到的,我对此并没有真正的经验。

提前致以亲切的问候和感谢

Michael


再次阅读问题并仔细查看代码后……您就快到了。你犯的错误是查看协议,它没有给你任何数据。相反,你必须询问交通工具,就像你已经做的那样

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

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

// 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() 可能会为您提供比请求的更大的块,因此额外使用框架运输,它自动携带序列化数据中的真实数据大小。后者的一些示例代码可以在测试客户端或服务器代码 https://github.com/apache/thrift/blob/master/test/cpp/src/TestClient.cpp.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Thrift 通过共享内存进行 IPC 通信 的相关文章

  • PHP 中的共享内存文件

    I use openssl pkcs7 sign and openssl pkcs7 encrypt创建加密数据 这些函数仅接受文件名 我想将临时文件存储在共享内存中以提高性能 我明白在 Linux 中我可以file put content
  • Python 多进程字典列表

    我需要使用 Python 3 6 在多进程中做一些事情 也就是说 我必须更新一个添加对象列表的字典 由于这些对象是不可拾取的 我需要使用dill代替pickle and multiprocess from pathos代替multiproc
  • Hbase 客户端因 /hbase 错误导致连接丢失

    我快要疯了 安装了Hadoop Hbase 一切都在运行 opt jdk1 6 0 24 bin jps 23261 ThriftServer 22582 QuorumPeerMain 21969 NameNode 23500 Jps 23
  • 通过管道传输的 Thrift IPC (Windows)

    我一直在关注 Thrift 对 Windows 的支持 并且由于许多贡献者的努力 VS 开发已经取得了长足的进步 有针对编译器和 C 库的 VS 2010 项目 我已经确认它们在 0 8 中运行良好 http thrift apache o
  • API Level 26 以下的 NDK 和 SDK 之间共享内存

    用 C 编写的库会产生连续的数据流 并且必须将其移植到不同的平台上 现在将lib集成到android应用程序中 我试图在NDK和SDK之间创建共享内存 下面是工作片段 原生代码 include
  • Linux 共享内存:shmget() 与 mmap()?

    In this https stackoverflow com questions 5656530 how to use shared memory with linux in c建议OP使用线程mmap 代替shmget 在 Linux
  • Erlang 通用二进制格式?有人用吗?

    我最近偶然发现了这个 2002 年的会议paper http www erlang se workshop 2002 Armstrong pdf 让 Erlang 与外界对话作者 Joe Armstrong 我想知道这是否是一个被忽视的标准
  • 确定文件映射到内存的次数

    是否可以获取 Linux 中特定文件描述符上的内存映射总量 为了清楚起见 我制作了一个如何打开 创建内存映射的小示例代码 int fileDescriptor open mapname O RDWR O CREAT O EXCL 0666
  • 如何调整/dev/shm的大小?

    On Ubuntu 18 04 当我跑步时 df h 我看到这个结果 Filesystem Size Used Avail Use Mounted on tmpfs 3 9G 73M 3 8G 2 dev shm dev shm大小为3 9
  • 将 IVSHMEM 与 libvirt virt-manager 结合使用

    Using ivshmem in qemu需要执行以下步骤 在主机中启动 ivshmem 服务器 ivshmem server这将创建一个unix域套接字 tmp ivshmem socket 使用以下命令行选项启动 qemu charde
  • 如何从memfd_create获取内存地址?

    在我的应用程序中我需要共享内存 父母和孩子之间 使用fork execl 我用memfd create分配内存 因为它提供了 文件描述符 可以方便地在子进程中使用 进程 描述符通过dup2 before execl 附加到分配的内存 我不使
  • 将内存映射与服务一起使用

    我构建了一个也可以作为服务运行的应用程序 使用 service 转变 当我从命令提示符运行服务时 这可以完美地工作 没有任何问题 我设置了一些设置 可以让我在不作为真正的服务运行时从控制台调试它 但是 当我尝试将其作为真正的服务运行然后使用
  • 停止 Thrift 服务器(TSimpleServer)

    我有一个 Thrift 服务器的简单用例 TSimpleServer 其中我生成了几个线程 除了主线程之外 新生成的线程之一进入 Thrift 事件循环 即server serve 在主线程中收到信号后 我调用server stop 这导致
  • 并发互锁和读取是否需要内存屏障或锁定?

    这是一个简单的问题 但是读完之后为什么需要内存屏障 https stackoverflow com questions 3493931 why do i need a memory barrier我对此很困惑 在下面的示例中 假设不同的线程
  • 我可以使用 shmctl 调整 Linux 共享内存的大小吗?

    我有一个 C 应用程序 它通过 shmget 2 在 Linux 系统上分配共享内存 我存储在共享内存中的数据会定期增长 我想以类似于 realloc 增长常规内存的方式调整共享内存的大小 有没有办法做到这一点 我在 IBM 网站上找到了一
  • 将文件中的非连续块映射到连续内存地址

    我对使用内存映射IO的前景感兴趣 最好是 利用 boost interprocess 中的设施实现跨平台 支持 将文件中的非连续系统页面大小块映射到 内存中连续的地址空间 一个简化的具体场景 我有许多 普通旧数据 结构 每个结构都有固定长度
  • Thrift 将可选转换为默认或必需

    我有一个节俭的结构 struct Message 1 optional int userID 将其更改为默认需求是否安全 struct Message 1 int userID 如果我知道它总是已设置 那么 需要 呢 如中所述这个答案 ht
  • 双向消息传递的节俭

    我很好奇 Thrift 是否适合我的用例 我正在制作另一个消息系统 其中有客户端和服务器 但客户端和服务器都向对方发起请求消息 并且并非所有消息都可能是请求 而只是通知 回到 10 年前 我使用手动二进制编解码器完成了这项工作 回到 5 年
  • 如何在 App Engine 中灵活更改 /dev/shm 的大小

    如何更改共享内存文件夹的大小 dev shm在 App Engine 灵活应用程序中 默认情况下 它设置为 64M 太低 无法运行许多应用程序 例如 Chrome 我看不出有什么办法可以改变它 如果您有权访问 可以通过多种方法进行更改doc
  • 多处理中的共享内存

    我有三个大清单 第一个包含位数组 模块位数组 0 8 0 另外两个包含整数数组 l1 bitarray 1 bitarray 2 bitarray n l2 array 1 array 2 array n l3 array 1 array

随机推荐

  • 完全匹配where子句mysql中utf8中的单词

    我有一个这样的查询 SELECT FROM category keyword WHERE keyword cho 本次查询返回结果keyword cho ch ch ch 我只希望结果是 keywords cho 而不是 ch ch 我能怎
  • TextField 和属性之间的 JavaFX 绑定

    如果您在 JavaFX TextField 和属性之间创建绑定 则每次击键时该绑定都会失效 从而导致文本发生更改 如果您有一系列绑定 则默认行为可能会导致问题 因为中间的编辑值可能无效 好的 我知道我可以创建从属性到文本字段的单向绑定 并注
  • Collections.sort() 抛出 Comparison 方法违反了其一般契约!例外

    我正在尝试对 List 对象进行排序 但抛出了此异常 仅适用于大型列表 排序代码 List
  • 当VBA中的某些单元格是某个数字时,如何让工作表不打印(while循环)

    我创建了一个脚本 该脚本从 SAP 获取信息并将其导出到 Excel 中 每当运行该宏时 每次返回的行数都不同 i e 第1次 4行第二次 12行等 将它们填充到表中后 我使用强大的查询编辑器读取该文件并创建一个非常简单的 ETL 函数 在
  • 从 Storyboard 转到 XIB

    我有一个故事板视图控制器 它是我的应用程序中的第一个屏幕 该应用程序的其余部分是使用 xib 设计的 我想从故事板 VC 中的按钮转到 XIB 文件 我知道如何从 xib 到故事板执行此操作 但是这个怎么样 提前致谢 从 xib 到故事板
  • 初始化顺序问题

    给出代码示例 class B Some contents class C private B b class A private B b C c 类 C 有一个对 b 的引用 因此需要用它来初始化 类 A 包含 B 的实例和 C 的实例 我
  • Facebook javascript API 中的分页是如何工作的?

    我正在尝试使用 javascript sdk 恢复我的 Facebook 新闻源中上周的帖子 我能够获得第一页 但随后 我不知道如何继续迭代其他页面 我用下面的代码尝试过 loadPosts bind click function FB a
  • undefined 不是一个函数(评估属性[typeof Symbol === "function"?Symbol.iterator:"@@iterator"]()') React Native

    以前运行良好 但在更新一些项目依赖项后突然出现此错误 它来自渲染的组件slate js对象 我不是渲染编辑器而是渲染文本 我读到这个错误可以通过更新来解决babel preset react native 但我的已经是最新的了 我也导入过b
  • 如何在 Mac OS X 上以 root 身份运行脚本? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我应该在 Mac OS X 终端上输入什么才能以 root 身份运行脚本 与任何基于 UNIX 的环境一样 您可以使用sudo http xkcd c
  • SVG 渐变颜色

    Hi I m working with SVG here I trying to add the gradient to SVG like this 白色和灰色渐变 但我无法实现所需的输出 谁能指出我正确的方向
  • 如何在引导日期选择器中突出显示特定日期?

    我正在使用引导日期选择器 我需要突出显示一些随机日期 例如 我需要突出显示 1 3 8 20 21 16 26 30 等日期 您能告诉我如何在引导日期选择器中突出显示这些随机日期吗 根据 Amphetamachine 的建议在 bootst
  • 信任 Google API 响应对象和所有权

    我已经在我的网络应用程序中成功实现了 Google Login 使用适用于客户端 Web 应用程序的 OAuth 2 0 https developers google com identity protocols OAuth2UserAg
  • 如何在 Python 中运行 .exe 文件

    我正在尝试在 python2 7 中运行 exe 文件 我已经尽了一切努力来搜索它 这是我尝试过的一些代码 subprocess Popen r C Programs Files Internet Explorer iexplore exe
  • 调试时 VS2012 的 VSIX 扩展未运行

    我在 Visual Studio 2012 中创建了一个新的 VSIX 扩展项目 并编写了一个 MEF 分类器 作为测试 该分类器应该简单地突出显示 mylang文件 以下是我的 NET 4 5 代码的相关部分 internal stati
  • 如何通过 powershell 或 C# 使用本地 IP 远程更新 azure webapp 防火墙

    如何使用本地 PC IP 地址远程更新我的 azure webapp 防火墙 以便通过 powershell 或 C 进行管理 我已经查看了文档 但我只能从实际服务器本身找到如何操作 而不能远程操作 我可以让 Visual Studio 弹
  • 可绘制资源中带有形状的文本

    我可以在可绘制资源中创建文本形状吗 我在谷歌上搜索了很多 但什么也没找到 这是我的绘图文件
  • 退出和中止有什么区别?

    The abort http ruby doc org core 2 1 1 Kernel html method i abort文件说abort will 通过调用 Kernel exit false 立即有效地终止执行 立即 到底是什么
  • 如何根据内容调整QTableView的高度?

    在我的布局中 动态生成的 QTableView 似乎已调整大小以仅显示一行 我想让表视图的容器有一个滚动条 而不是单个表视图 它应该显示完整的内容 显然 Qt 没有为此内置任何东西 您需要手动计算和设置大小 这就是我垂直调整大小的方法 Qt
  • XMLSerializer.Serialize 上的 .NET OutOfMemoryException

    我有一个网站 每当它到达我的代码中的以下位置时 就会抛出 OutOfMemoryException XmlSerializer xs new XmlSerializer t xoverrides 看到只有在网络服务器上时才会发生这种情况 我
  • 使用 Thrift 通过共享内存进行 IPC 通信

    我找不到关于如何使用 apache thrift 通过共享内存进行 ipc 通信的足够示例 我的目标是在 thrift 的帮助下序列化现有的类 然后通过共享内存发送到另一个进程 在该进程中我在 thrift 的帮助下再次反序列化它 现在我正