是否可以按名称打开共享内存段?

时间:2011-11-30 14:36:34

标签: c++ memory-management shared-memory

char* openSharedMemory(string name);

是否可以实现上述功能?给定名称,使用该名称打开共享内存段并将句柄返回到共享内存。如果不存在具有给定名称的共享内存,请创建一个并返回句柄。

5 个答案:

答案 0 :(得分:2)

是的,如果您在最近的任何Unix上,请查看shm_overview(7),特别是shm_open(3)

答案 1 :(得分:2)

好吧,boost::interprocess支持这个..

答案 2 :(得分:1)

便携式地,您可以使用Boost.Interprocess

在Posix上,您可以这样做:

#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>

const size_t SHARED_MEMORY_SIZE = whatever;

char* openSharedMemory(std::string const &name)
{
    int fd = shm_open(name.c_str(), O_RDWR, 0);
    if (fd < 0) {
        // failed to open existing file, try to create a new one
        fd = shm_open(name.c_str(), O_RDWR | O_CREAT, 0666);
        if (fd < 0 || ftruncate(fd, SHARED_MEMORY_SIZE) != 0) {
            return NULL;
        }
    }
    return static_cast<char*>(
        mmap(NULL, SHARED_MEMORY_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0));
}

虽然你应该将它包装在一个类中,但要保留文件描述符,以便在销毁时取消映射并关闭共享内存对象。

答案 3 :(得分:0)

如果是Windows,请查看使用内存映射文件。

答案 4 :(得分:0)

在Windows上查看MemoryMappedFiles和名称为

的CreateFileMapping