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

how to get a shmid from a boost::interprocess::managed_shared_memory object

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                         

managed_shared_memory 用于跨平台使用,它使用指向不同 OSes 上的内部实现的 BasicManagedMemoryImpl 指针。例如,它使用 basic_managed_windows_shared_memory 作为 Windows 上的后端。 managed_shared_memory 出于可移植性考虑,没有获取 shmid 的方法。如果你 OS 支持系统 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查看