c++ - Linux 中的共享内存

标签 c++ linux static shared-memory

我想以不同进程可以访问相同静态数据的方式实现类:

class Shared()
{
public:
    static int GetValue();
    static void SetValue(int value);
};

如何使用共享内存来存储内部数据来做到这一点。有人可以帮我做到这一点吗?任何答案将不胜感激。

最佳答案

示例代码如下所示,这是一个非常基本的实现。类(class)将解释如何创建、设置/获取单个值以及销毁共享内存。错误检查、通知等可以使用模板添加为策略类。

#include <iostream>
#include <stdexcept>
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <string.h>

template <key_t KEY, typename T, int COUNT = 1>
class Shm
{

public:
  Shm():shm_(0)
  {
    get();
    attach();
  }

  ~Shm()
  {
    if(shm_ != NULL)
    {
      shmdt(shm_);
      shm_ = 0;
    }
  }

  //Set one element 
  void SetValue(const T* data, int count = 1)
  {
    if(sizeof(T)*count > sizeof(T) * COUNT)
    {
      throw std::runtime_error("Data size greater than shm size");
    }
    memcpy(shm_, data, sizeof(T)*count);
  }

  //Get pointer to element
  const T* GetValue()
  {
    T* ptr = new(shm_) T;
    return ptr;
  }


  static void create()
  {
    if ((shmid_ = shmget(KEY, COUNT*sizeof(T), IPC_CREAT | 0666)) < 0) 
    {
      throw std::runtime_error("Failed create shm");
    }
  }
  static void destroy()
  {
    get();
    if(shmctl(shmid_, IPC_RMID, NULL)<0)
    {
    perror("shctl");
    throw std::runtime_error("Error cannot remove shared memory");
    }
      shmid_ = -1;
  }

private:
  static void get()
  {
    if(shmid_ == -1)
    {
      if((shmid_ = shmget(KEY, COUNT*sizeof(T), 0666)) < 0)
      {
    perror("shmget");
    throw std::runtime_error("Shared memory not created");
      }
    }

  }

  void attach()
  {
    if ((shm_ = shmat(shmid_, NULL, 0)) == (char *) -1) 
    {
    throw std::runtime_error("Failed attach shm");
    }
  }
  void* shm_;
  static int shmid_;
};


template <key_t KEY, typename T, int COUNT> 
int Shm<KEY, T, COUNT>::shmid_ = -1;

int main(int argc, char ** argv)
{
  if(argc == 2)
  {
    if(std::string(argv[1]) == "server")
    {
      int val = 50;
      Shm<0x1234, int>::create(); 
      Shm<0x1234, int> shm;
      shm.SetValue(&val);
    }
    else if(std::string(argv[1]) == "client")
    {
      Shm<0x1234, int> shm;
      const int* ptr = shm.GetValue();
      std::cout <<"Val = " << *ptr <<std::endl;
      Shm<0x1234, int>::destroy(); 
    }
  }
  else
  {
    std::cerr<<"Usage shm [server][client]"<<std::endl;
  }

  return 0;
}

关于c++ - Linux 中的共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33876164/

相关文章:

c++ - 创建我自己的 Qt 组件/小部件/工具的方法

c++ - C++-如何为类模板声明函数模板好友

c++ - C++ 标准第 3.4.3.1 节中此语句的示例?

html - 自动检查 html 页面中的特定元素是否已更新

linux - bash 使用 -z 检查空字符串/行

c++ - 客户端验证算法?

python - 抓取终端的输出

java - 我应该如何调用类静态初始化?

c - 在运行时重新初始化全局/静态内存或对全局/静态变量进行静态分析

android - Kotlin 静态函数 : companion object, @JvmStatic @JvmField