【问题标题】:List names of boost named managed shared memory列出 boost 命名托管共享内存的名称
【发布时间】:2015-01-15 10:12:02
【问题描述】:

我正在使用 boost managed_shared_memory。我正在按名称创建。

例如:managed_shared_memory Segment(open_only, OneName);

在自己的段中,我可以列出所有现有对象(由 Segment::construct 创建)。

但是是否可以获得现有细分的列表? (例如,为了避免重复命名...)

比如(伪):

boost::interprocess::list_existing_segments 

如果可能,请解释。如果不是,请确认。

问候 早吃

【问题讨论】:

    标签: c++ linux boost shared-memory


    【解决方案1】:

    但是是否可以获得现有细分的列表?

    如果有足够的权限,可能是的。但是,这不是 Boost 关注的地方(使用 Process Explorer 之类的工具来检查系统详细信息;在 linux 上,ls /dev/shm 通常会有所帮助)。 ¹

    (例如,为了避免重复命名...)

    这是不可行的,因为此时您只能参加比赛。一旦您“确定”给定名称尚未使用,它可能同时由系统中的许多其他进程之一创建。所以你检查的结果是没有用的。

    你不能通过进程间同步来解决这个问题,因为(catch-22)同样的问题也适用于用于那个的同步对象。

    简而言之:你只能尝试创建并注意到它失败了。


    ¹ 同样,Boost 并不关注低级硬件访问,而是抽象出可移植的高级接口

    【讨论】:

    • 我认为,它是准确的。
    • 还有一个问题:您也可以使用内存地址...,那么名称会发生​​什么(这些名称必须存储在任何地方,不是吗)?
    • 不清楚你的意思。使用内存地址与共享内存无关。共享内存不需要在每个进程的地址空间中都需要有相同的基地址。是的,内核有这些映射,但这并不意味着它必须将它们暴露给用户态进程。更不用说 Boost Interprocess“必须”公开此功能了。
    • IIRC 您可以通过名称 (managed_shared_memory Segment(open_only, OneName);) 或内存地址创建托管共享内存。但现在它是平等的......我的意思是,这个提升知道一个部分是否存在。所以我认为名称必须存储在某个地方,所以...IMO 必须有可能列出所有现有的段。
    • 您只能按名称打开。同时,您可以(不可移植地)建议一个基地址。它可能会根据特定平台上的地址空间布局而起作用(这样有时您可以在共享内存中使用原始指针)。 Boost IPC 使用offset_ptr<> 解决了它
    猜你喜欢
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2016-10-02
    • 1970-01-01
    • 2020-09-24
    相关资源
    最近更新 更多