Marine Library  1.0
C++ library for Linux Networking Development
sysv_shm.hh
1 #ifndef DOZERG_SYSV_SHM_H_20130301
2 #define DOZERG_SYSV_SHM_H_20130301
3 
4 /*
5  对SysV共享内存的封装
6  CSysvShm
7 //*/
8 
9 #include <errno.h>
10 #include <cassert>
11 #include "tools/system.hh"
12 #include "impl/sysv_shm_impl.hh"
13 
14 NS_SERVER_BEGIN
15 
16 //T: 共享内存代表的对象类型//N: 共享内存包含的对象个数 //RO: 共享内存是否只读 template<typename T, size_t N = 1, bool RO = false> class CSysvShm; //只读共享内存 template<typename T, size_t N> class CSysvShm<T, N, true> { typedef NS_IMPL::CSysvShmImpl __Shm; public: typedef T value_type; typedef const T & const_reference; typedef const T * const_pointer; static const int kModeDefault = SHM_R | SHM_W; //共享内存的默认读写权限 static const size_t kSize = N; //对象数组的元素个数 //返回上次系统错误描述 static std::string ErrMsg(){return tools::ErrorMsg(errno);} //构造函数 CSysvShm():readonly_(true){} //共享内存是否已attach bool valid() const{return shm_.valid();} //创建并attach共享内存 //pathname: 生成key的文件名 //projId: 生成key的项目id //key: 共享内存的key //address: 建议attach到的地址 //mode: 共享内存本身的权限 //return: // <0 出错 // 0 shm已存在,attach成功 // >0 shm不存在,创建并attach成功 int init(const std::string & pathname, int projId, void * address = NULL, int mode = kModeDefault){ if(pathname.empty()) return -1; key_t key = ::ftok(pathname.c_str(), projId); if(key < 0) return -1; return init(key, address, mode); } int init(key_t key = IPC_PRIVATE, void * address = NULL, int mode = kModeDefault){ return shm_.init(key, sizeof(value_type) * kSize, readonly_, address, mode); } //设置是否常驻物理内存 //on: // true 常驻内存 // false 不常驻内存 //return: // true 设置成功 // false 设置失败 bool setResident(bool on){return shm_.setResident(on);} //标记共享内存可删除 //注意: 当没有进程attach到共享内存时,系统才会真正删除共享内存 //return: // true 成功 // false 失败 bool setDeleted(){return shm_.setDeleted();} //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
17 //N: 共享内存包含的对象个数//RO: 共享内存是否只读 template<typename T, size_t N = 1, bool RO = false> class CSysvShm; //只读共享内存 template<typename T, size_t N> class CSysvShm<T, N, true> { typedef NS_IMPL::CSysvShmImpl __Shm; public: typedef T value_type; typedef const T & const_reference; typedef const T * const_pointer; static const int kModeDefault = SHM_R | SHM_W; //共享内存的默认读写权限 static const size_t kSize = N; //对象数组的元素个数 //返回上次系统错误描述 static std::string ErrMsg(){return tools::ErrorMsg(errno);} //构造函数 CSysvShm():readonly_(true){} //共享内存是否已attach bool valid() const{return shm_.valid();} //创建并attach共享内存 //pathname: 生成key的文件名 //projId: 生成key的项目id //key: 共享内存的key //address: 建议attach到的地址 //mode: 共享内存本身的权限 //return: // <0 出错 // 0 shm已存在,attach成功 // >0 shm不存在,创建并attach成功 int init(const std::string & pathname, int projId, void * address = NULL, int mode = kModeDefault){ if(pathname.empty()) return -1; key_t key = ::ftok(pathname.c_str(), projId); if(key < 0) return -1; return init(key, address, mode); } int init(key_t key = IPC_PRIVATE, void * address = NULL, int mode = kModeDefault){ return shm_.init(key, sizeof(value_type) * kSize, readonly_, address, mode); } //设置是否常驻物理内存 //on: // true 常驻内存 // false 不常驻内存 //return: // true 设置成功 // false 设置失败 bool setResident(bool on){return shm_.setResident(on);} //标记共享内存可删除 //注意: 当没有进程attach到共享内存时,系统才会真正删除共享内存 //return: // true 成功 // false 失败 bool setDeleted(){return shm_.setDeleted();} //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
18 //RO: 共享内存是否只读template<typename T, size_t N = 1, bool RO = false> class CSysvShm; //只读共享内存 template<typename T, size_t N> class CSysvShm<T, N, true> { typedef NS_IMPL::CSysvShmImpl __Shm; public: typedef T value_type; typedef const T & const_reference; typedef const T * const_pointer; static const int kModeDefault = SHM_R | SHM_W; //共享内存的默认读写权限 static const size_t kSize = N; //对象数组的元素个数 //返回上次系统错误描述 static std::string ErrMsg(){return tools::ErrorMsg(errno);} //构造函数 CSysvShm():readonly_(true){} //共享内存是否已attach bool valid() const{return shm_.valid();} //创建并attach共享内存 //pathname: 生成key的文件名 //projId: 生成key的项目id //key: 共享内存的key //address: 建议attach到的地址 //mode: 共享内存本身的权限 //return: // <0 出错 // 0 shm已存在,attach成功 // >0 shm不存在,创建并attach成功 int init(const std::string & pathname, int projId, void * address = NULL, int mode = kModeDefault){ if(pathname.empty()) return -1; key_t key = ::ftok(pathname.c_str(), projId); if(key < 0) return -1; return init(key, address, mode); } int init(key_t key = IPC_PRIVATE, void * address = NULL, int mode = kModeDefault){ return shm_.init(key, sizeof(value_type) * kSize, readonly_, address, mode); } //设置是否常驻物理内存 //on: // true 常驻内存 // false 不常驻内存 //return: // true 设置成功 // false 设置失败 bool setResident(bool on){return shm_.setResident(on);} //标记共享内存可删除 //注意: 当没有进程attach到共享内存时,系统才会真正删除共享内存 //return: // true 成功 // false 失败 bool setDeleted(){return shm_.setDeleted();} //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
19 template<typename T, size_t N = 1, bool RO = false>
20 class CSysvShm;
21 
22 //只读共享内存template<typename T, size_t N> class CSysvShm<T, N, true> { typedef NS_IMPL::CSysvShmImpl __Shm; public: typedef T value_type; typedef const T & const_reference; typedef const T * const_pointer; static const int kModeDefault = SHM_R | SHM_W; //共享内存的默认读写权限 static const size_t kSize = N; //对象数组的元素个数 //返回上次系统错误描述 static std::string ErrMsg(){return tools::ErrorMsg(errno);} //构造函数 CSysvShm():readonly_(true){} //共享内存是否已attach bool valid() const{return shm_.valid();} //创建并attach共享内存 //pathname: 生成key的文件名 //projId: 生成key的项目id //key: 共享内存的key //address: 建议attach到的地址 //mode: 共享内存本身的权限 //return: // <0 出错 // 0 shm已存在,attach成功 // >0 shm不存在,创建并attach成功 int init(const std::string & pathname, int projId, void * address = NULL, int mode = kModeDefault){ if(pathname.empty()) return -1; key_t key = ::ftok(pathname.c_str(), projId); if(key < 0) return -1; return init(key, address, mode); } int init(key_t key = IPC_PRIVATE, void * address = NULL, int mode = kModeDefault){ return shm_.init(key, sizeof(value_type) * kSize, readonly_, address, mode); } //设置是否常驻物理内存 //on: // true 常驻内存 // false 不常驻内存 //return: // true 设置成功 // false 设置失败 bool setResident(bool on){return shm_.setResident(on);} //标记共享内存可删除 //注意: 当没有进程attach到共享内存时,系统才会真正删除共享内存 //return: // true 成功 // false 失败 bool setDeleted(){return shm_.setDeleted();} //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
23 template<typename T, size_t N>
24 class CSysvShm<T, N, true>
25 {
26  typedef NS_IMPL::CSysvShmImpl __Shm;
27 public:
28  typedef T value_type;
29  typedef const T & const_reference;
30  typedef const T * const_pointer;
31  static const int kModeDefault = SHM_R | SHM_W; //共享内存的默认读写权限
32  static const size_t kSize = N; //对象数组的元素个数 //返回上次系统错误描述 static std::string ErrMsg(){return tools::ErrorMsg(errno);} //构造函数 CSysvShm():readonly_(true){} //共享内存是否已attach bool valid() const{return shm_.valid();} //创建并attach共享内存 //pathname: 生成key的文件名 //projId: 生成key的项目id //key: 共享内存的key //address: 建议attach到的地址 //mode: 共享内存本身的权限 //return: // <0 出错 // 0 shm已存在,attach成功 // >0 shm不存在,创建并attach成功 int init(const std::string & pathname, int projId, void * address = NULL, int mode = kModeDefault){ if(pathname.empty()) return -1; key_t key = ::ftok(pathname.c_str(), projId); if(key < 0) return -1; return init(key, address, mode); } int init(key_t key = IPC_PRIVATE, void * address = NULL, int mode = kModeDefault){ return shm_.init(key, sizeof(value_type) * kSize, readonly_, address, mode); } //设置是否常驻物理内存 //on: // true 常驻内存 // false 不常驻内存 //return: // true 设置成功 // false 设置失败 bool setResident(bool on){return shm_.setResident(on);} //标记共享内存可删除 //注意: 当没有进程attach到共享内存时,系统才会真正删除共享内存 //return: // true 成功 // false 失败 bool setDeleted(){return shm_.setDeleted();} //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
33  //返回上次系统错误描述 static std::string ErrMsg(){return tools::ErrorMsg(errno);} //构造函数 CSysvShm():readonly_(true){} //共享内存是否已attach bool valid() const{return shm_.valid();} //创建并attach共享内存 //pathname: 生成key的文件名 //projId: 生成key的项目id //key: 共享内存的key //address: 建议attach到的地址 //mode: 共享内存本身的权限 //return: // <0 出错 // 0 shm已存在,attach成功 // >0 shm不存在,创建并attach成功 int init(const std::string & pathname, int projId, void * address = NULL, int mode = kModeDefault){ if(pathname.empty()) return -1; key_t key = ::ftok(pathname.c_str(), projId); if(key < 0) return -1; return init(key, address, mode); } int init(key_t key = IPC_PRIVATE, void * address = NULL, int mode = kModeDefault){ return shm_.init(key, sizeof(value_type) * kSize, readonly_, address, mode); } //设置是否常驻物理内存 //on: // true 常驻内存 // false 不常驻内存 //return: // true 设置成功 // false 设置失败 bool setResident(bool on){return shm_.setResident(on);} //标记共享内存可删除 //注意: 当没有进程attach到共享内存时,系统才会真正删除共享内存 //return: // true 成功 // false 失败 bool setDeleted(){return shm_.setDeleted();} //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
34  static std::string ErrMsg(){return tools::ErrorMsg(errno);}
35  //构造函数
36  CSysvShm():readonly_(true){}
37  //共享内存是否已attach
38  bool valid() const{return shm_.valid();}
39  //创建并attach共享内存 //pathname: 生成key的文件名 //projId: 生成key的项目id //key: 共享内存的key //address: 建议attach到的地址 //mode: 共享内存本身的权限 //return: // <0 出错 // 0 shm已存在,attach成功 // >0 shm不存在,创建并attach成功 int init(const std::string & pathname, int projId, void * address = NULL, int mode = kModeDefault){ if(pathname.empty()) return -1; key_t key = ::ftok(pathname.c_str(), projId); if(key < 0) return -1; return init(key, address, mode); } int init(key_t key = IPC_PRIVATE, void * address = NULL, int mode = kModeDefault){ return shm_.init(key, sizeof(value_type) * kSize, readonly_, address, mode); } //设置是否常驻物理内存 //on: // true 常驻内存 // false 不常驻内存 //return: // true 设置成功 // false 设置失败 bool setResident(bool on){return shm_.setResident(on);} //标记共享内存可删除 //注意: 当没有进程attach到共享内存时,系统才会真正删除共享内存 //return: // true 成功 // false 失败 bool setDeleted(){return shm_.setDeleted();} //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
40  //pathname: 生成key的文件名
41  //projId: 生成key的项目id
42  //key: 共享内存的key
43  //address: 建议attach到的地址
44  //mode: 共享内存本身的权限
45  //return:
46  // <0 出错 // 0 shm已存在,attach成功 // >0 shm不存在,创建并attach成功 int init(const std::string & pathname, int projId, void * address = NULL, int mode = kModeDefault){ if(pathname.empty()) return -1; key_t key = ::ftok(pathname.c_str(), projId); if(key < 0) return -1; return init(key, address, mode); } int init(key_t key = IPC_PRIVATE, void * address = NULL, int mode = kModeDefault){ return shm_.init(key, sizeof(value_type) * kSize, readonly_, address, mode); } //设置是否常驻物理内存 //on: // true 常驻内存 // false 不常驻内存 //return: // true 设置成功 // false 设置失败 bool setResident(bool on){return shm_.setResident(on);} //标记共享内存可删除 //注意: 当没有进程attach到共享内存时,系统才会真正删除共享内存 //return: // true 成功 // false 失败 bool setDeleted(){return shm_.setDeleted();} //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
47  // 0 shm已存在,attach成功
48  // >0 shm不存在,创建并attach成功
49  int init(const std::string & pathname, int projId, void * address = NULL, int mode = kModeDefault){
50  if(pathname.empty())
51  return -1;
52  key_t key = ::ftok(pathname.c_str(), projId);
53  if(key < 0)
54  return -1;
55  return init(key, address, mode);
56  }
57  int init(key_t key = IPC_PRIVATE, void * address = NULL, int mode = kModeDefault){
58  return shm_.init(key, sizeof(value_type) * kSize, readonly_, address, mode);
59  }
60  //设置是否常驻物理内存 //on: // true 常驻内存 // false 不常驻内存 //return: // true 设置成功 // false 设置失败 bool setResident(bool on){return shm_.setResident(on);} //标记共享内存可删除 //注意: 当没有进程attach到共享内存时,系统才会真正删除共享内存 //return: // true 成功 // false 失败 bool setDeleted(){return shm_.setDeleted();} //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
61  //on:
62  // true 常驻内存 // false 不常驻内存 //return: // true 设置成功 // false 设置失败 bool setResident(bool on){return shm_.setResident(on);} //标记共享内存可删除 //注意: 当没有进程attach到共享内存时,系统才会真正删除共享内存 //return: // true 成功 // false 失败 bool setDeleted(){return shm_.setDeleted();} //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
63  // false 不常驻内存 //return: // true 设置成功 // false 设置失败 bool setResident(bool on){return shm_.setResident(on);} //标记共享内存可删除 //注意: 当没有进程attach到共享内存时,系统才会真正删除共享内存 //return: // true 成功 // false 失败 bool setDeleted(){return shm_.setDeleted();} //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
64  //return:
65  // true 设置成功
66  // false 设置失败 bool setResident(bool on){return shm_.setResident(on);} //标记共享内存可删除 //注意: 当没有进程attach到共享内存时,系统才会真正删除共享内存 //return: // true 成功 // false 失败 bool setDeleted(){return shm_.setDeleted();} //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
67  bool setResident(bool on){return shm_.setResident(on);}
68  //标记共享内存可删除 //注意: 当没有进程attach到共享内存时,系统才会真正删除共享内存 //return: // true 成功 // false 失败 bool setDeleted(){return shm_.setDeleted();} //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
69  //注意: 当没有进程attach到共享内存时,系统才会真正删除共享内存 //return: // true 成功 // false 失败 bool setDeleted(){return shm_.setDeleted();} //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
70  //return:
71  // true 成功
72  // false 失败 bool setDeleted(){return shm_.setDeleted();} //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
73  bool setDeleted(){return shm_.setDeleted();}
74  //detach共享内存 //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
75  //注意: detach后,对应内存地址可能不可访问 void uninit(){return shm_.uninit();} //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
76  void uninit(){return shm_.uninit();}
77  //获取对象数组元素个数 size_t size() const{return kSize;} //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
78  size_t size() const{return kSize;}
79  //访问共享内存代表的对象数组 const_pointer ptr() const{ return reinterpret_cast<const_pointer>(shm_.addr()); } //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
80  const_pointer ptr() const{
81  return reinterpret_cast<const_pointer>(shm_.addr());
82  }
83  //通过索引访问对象 //index: 索引 const_reference operator [](size_t index) const{return ptr()[index];} //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
84  //index: 索引
85  const_reference operator [](size_t index) const{return ptr()[index];}
86  //访问第一个对象 const_reference front() const{ assert(valid()); return ptr()[0]; } protected: explicit CSysvShm(bool readonly):readonly_(readonly){} //fields __Shm shm_; bool readonly_; }; //可读写共享内存 template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
87  const_reference front() const{
88  assert(valid());
89  return ptr()[0];
90  }
91 protected:
92  explicit CSysvShm(bool readonly):readonly_(readonly){}
93  //fields
94  __Shm shm_;
95  bool readonly_;
96 };
97 
98 //可读写共享内存template<typename T, size_t N> class CSysvShm<T, N, false> : public CSysvShm<T, N, true> { typedef CSysvShm<T, N, true> __MyBase; public: typedef T & reference; typedef T * pointer; CSysvShm():__MyBase(false){} //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
99 template<typename T, size_t N>
100 class CSysvShm<T, N, false> : public CSysvShm<T, N, true>
101 {
103 public:
104  typedef T & reference;
105  typedef T * pointer;
106  CSysvShm():__MyBase(false){}
107  //访问共享内存代表的对象数组 using __MyBase::ptr; pointer ptr(){ return reinterpret_cast<pointer>(__MyBase::shm_.addr()); } //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
108  using __MyBase::ptr;
109  pointer ptr(){
110  return reinterpret_cast<pointer>(__MyBase::shm_.addr());
111  }
112  //通过索引访问对象 //index: 索引 using __MyBase::operator []; reference operator [](size_t index){return ptr()[index];} //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
113  //index: 索引
114  using __MyBase::operator [];
115  reference operator [](size_t index){return ptr()[index];}
116  //访问第一个对象 using __MyBase::front; reference front(){ assert(__MyBase::valid()); return ptr()[0]; } }; NS_SERVER_END #endif
117  using __MyBase::front;
118  reference front(){
119  assert(__MyBase::valid());
120  return ptr()[0];
121  }
122 };
123 
124 NS_SERVER_END
125 
126 #endif
127 
Definition: sysv_shm.hh:20
Definition: sysv_shm.hh:24