如何从 boost::interprocess::managed_shared_memory 对象中获取 shmid

Posted

技术标签:

【中文标题】如何从 boost::interprocess::managed_shared_memory 对象中获取 shmid【英文标题】:how to get a shmid from a boost::interprocess::managed_shared_memory object 【发布时间】:2016-04-20 02:13:35 【问题描述】:

boost::interprocess 会像这样创建一个 shm:

boost::interprocess::managed_shared_memory segment(boost::interprocess::open_or_create, "ContainerSharedMemory", 65536);

但是怎么能像这样看这个shm:

/Tool/SHMCache$ ipcs -m

key        shmid      owner      perms      bytes      nattch     status      
0x00005feb 0          root       666        12000      2                       
0x00005fe7 32769      root       666        524288     2                       
0x00005fe8 65538      root       666        2097152    2                       
0x0001c08e 98307      root       777        2072       0                         

【问题讨论】:

【参考方案1】:

managed_shared_memory 用于跨平台使用,它使用BasicManagedMemoryImpl 指针指向不同操作系统上的内部实现。例如,它在 Windows 上使用basic_managed_windows_shared_memory 作为后端。为了可移植性,managed_shared_memory 没有获取 shmid 的方法。如果你的操作系统支持system V共享内存,你可以使用basic_managed_xsi_shared_memory,它有get_shmid()方法和与basic_managed_shared_memory几乎相同的接口。一个简单的例子:

#include <boost/interprocess/xsi_shared_memory.hpp>
#include <boost/interprocess/mapped_region.hpp>

using namespace boost::interprocess;

int main(int argc, char *argv[])

    //Build XSI key (ftok based)
    xsi_key key(argv[0], 1);
    //Create a shared memory object.
    xsi_shared_memory shm (create_only, key, 1000);
    // TODO Remove if exists
    printf("shmid: %d\n", shm.get_shmid());

如果共享内存创建成功,你可以在ipcs -m看到它。

【讨论】:

Linux 内核完全支持 System V。当然你可以在linux上运行这个简单的程序。 谢谢,我会试试这个。以及如何获得有关 managed_shared_memory 的更多详细信息 boost docs 谈谈这个。

以上是关于如何从 boost::interprocess::managed_shared_memory 对象中获取 shmid的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 boost::interprocess 在向量中构造向量

为啥我不能使用 Boost.Interprocess 设置从一个进程通过另一个进程创建的一些内存?

boost::interprocess::managed_mapped_file 如何包含弹性向量?

boost::interprocess::map - 如何使用 basic_string 作为类型更新值

Boost.Interprocess内存位置

boost::interprocess::string 转换为 char*