【问题标题】:Is it possible to open shared memory segment by name?是否可以按名称打开共享内存段?
【发布时间】:2011-11-30 14:36:34
【问题描述】:
char* openSharedMemory(string name);

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

【问题讨论】:

  • 共享内存段是什么意思?
  • @BjörnPollex 只是进程之间共享的一块内存用于通信。
  • 这取决于平台 - 你在哪个平台上?
  • 有了像共享内存这样高度依赖平台的概念,一些关于您的平台的注释肯定会很有用。
  • @BjörnPollex Linux 和 Windows。

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


【解决方案1】:

是的,如果您使用的是任何最新的 Unix,请查看 shm_overview(7),尤其是 shm_open(3)

【讨论】:

    【解决方案2】:

    嗯,boost::interprocess 支持这个..

    【讨论】:

      【解决方案3】:

      便携式,您可以使用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));
      }
      

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

      【讨论】:

      • 我尝试使用 g++ 编译您的代码,却得到“未定义对 shm_open 的引用”错误:(
      【解决方案4】:

      如果是 Windows,请考虑使用内存映射文件。

      【讨论】:

        【解决方案5】:

        在 Windows 上查看 MemoryMappedFiles 和 CreateFileMapping 的名称

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-08
          • 2013-10-12
          • 1970-01-01
          • 1970-01-01
          • 2014-07-16
          • 1970-01-01
          • 2012-10-09
          相关资源
          最近更新 更多