在没有共享内存的情况下提升进程间字符串

Posted

技术标签:

【中文标题】在没有共享内存的情况下提升进程间字符串【英文标题】:Boost interprocess string without shared memory 【发布时间】:2013-10-16 08:56:27 【问题描述】:

所以,这个问题与前一个问题相关联(std::string 没有从char* 复制)。

现在我遇到了boost:interprocess::string,它允许在共享内存 地址空间内构造字符串。由于我已经获得了 char* 内存,我想知道是否可以重用 boost:interprocess::string 以避免复制。

但是,我正在阅读的每个文档都使用 boost::interprocess::managed_shared_memory 及其兄弟。

有没有人使用提升管理字符串没有共享内存?怎么样?

谢谢!

【问题讨论】:

【参考方案1】:

简短回答:不。

更长的答案:您必须了解您的 std::string 实现。例如 LLVM 的 libcxx 参见 here。您可以在其中获取您的 char*,但它可能涉及丑陋的 hack,您必须针对任何 STL 实现调整您的代码。

【讨论】:

【参考方案2】:

问题是你的 char * 指向你的进程的内存(堆),当进程不再运行这个内存是无效的。共享内存在进程之间共享。 您必须从 char * 复制到共享内存段中,在我看来这是唯一的选择。请告诉我您的 char * 指向堆上的哪个位置?

但是从共享内存或内存映射文件中读取可以在不复制的情况下完成,您可以使用像 string_view 这样的容器 boost::string_ref 或 boost::string_view 或 C++17 std::字符串视图include <experimental/string_view>。这些是没有所有权的容器,允许您通过 char * , size 引用内存,但是由于共享内存是共享的,因此很难想象它是否可以成为生产质量代码,因为任何进程都可以更改您的内存,除非您从不写但是仅从 SHM 读取。 在我看来,答案是否定的。不过我会等待更有经验的开发者。

【讨论】:

以上是关于在没有共享内存的情况下提升进程间字符串的主要内容,如果未能解决你的问题,请参考以下文章

将进程间管理的共享内存原始指针提升为类成员

提升进程间共享内存删除对象而不破坏

(转载)linux下的僵尸进程处理SIGCHLD信号Linux环境进程间通信: 共享内存(下)

linux进程间通信之共享内存学习记录

Linux环境编程之共享内存区:共享内存区简单介绍

linux进程间通信之System V共享内存详解及代码示例