Marine Library  1.0
C++ library for Linux Networking Development
posix_shm_file.hh
1 #ifndef DOZERG_POSIX_SHM_FILE_H_20130305
2 #define DOZERG_POSIX_SHM_FILE_H_20130305
3 
4 #include <sys/mman.h>
5 #include <sys/stat.h>
6 #include "file.hh"
7 
8 NS_SERVER_BEGIN
9 
10 class CPosixShmFile : public CFile
11 {
12  typedef CFile __MyBase;
13 public:
14  static const int kFdType = 5;
15  //删除指定的文件
16  //shmname: 共享文件名,应该以'/'开头,例如"/shmname",实际位置可能是"/dev/shm/shmname"
17  static bool Unlink(const std::string & shmname){
18  if(shmname.empty())
19  return false;
20  return (0 == ::shm_unlink(shmname.c_str()));
21  }
22  //构造/复制/析构
23  //shmname: 共享文件名,应该以'/'开头,例如"/shmname",实际位置可能是"/dev/shm/shmname"
24  //flags: 参考shm_open(2)的flags参数 //mode: 参考shm_open(2)的mode参数 CPosixShmFile(){} //TODO:unit test explicit CPosixShmFile(const char * shmname, int flags = __MyBase::kFlagsDefault, mode_t mode = __MyBase::kModeDefault){ this->open(shmname, flags, mode); } explicit CPosixShmFile(const std::string & shmname, int flags = __MyBase::kFlagsDefault, mode_t mode = __MyBase::kModeDefault){ this->open(shmname, flags, mode); } CPosixShmFile(const CPosixShmFile & other){__MyBase::copyFrom(other);} CPosixShmFile & operator =(const CPosixShmFile & other){ __MyBase::copyFrom(other); return *this; } //返回fd类型和名称 int fdType() const{return kFdType;} const char * fdTypeName() const{return "CPosixShmFile";} //获取共享文件名 std::string shmname() const{return shmname_;} //打开文件 //shmname: 共享文件名,应该以'/'开头,例如"/shmname",实际位置可能是"/dev/shm/shmname" //flags: 参考shm_open(2)的flags参数 //mode: 参考shm_open(2)的mode参数 //return: // true 成功 // false 失败 //TODO:unit test bool open(const char * shmname, int flags = kFlagsDefault, mode_t mode = kModeDefault){ if(NULL == shmname) return false; if(valid()) this->close(); fd_ = ::shm_open(shmname, flags, mode); shmname_ = shmname; return valid(); } bool open(const std::string & shmname, int flags = kFlagsDefault, mode_t mode = kModeDefault){ return this->open(shmname.c_str(), flags, mode); } //删除文件 bool unlink(){ if(!valid()) return false; return Unlink(shmname()); } //内部状态描述,主要用于log std::string toString() const{ CToString oss; oss<<"{CFile="<<CFile::toString() <<", shmname_="<<shmname_ <<"}"; return oss.str(); } private: std::string shmname_; }; NS_SERVER_END #endif
25  //mode: 参考shm_open(2)的mode参数 CPosixShmFile(){} //TODO:unit test explicit CPosixShmFile(const char * shmname, int flags = __MyBase::kFlagsDefault, mode_t mode = __MyBase::kModeDefault){ this->open(shmname, flags, mode); } explicit CPosixShmFile(const std::string & shmname, int flags = __MyBase::kFlagsDefault, mode_t mode = __MyBase::kModeDefault){ this->open(shmname, flags, mode); } CPosixShmFile(const CPosixShmFile & other){__MyBase::copyFrom(other);} CPosixShmFile & operator =(const CPosixShmFile & other){ __MyBase::copyFrom(other); return *this; } //返回fd类型和名称 int fdType() const{return kFdType;} const char * fdTypeName() const{return "CPosixShmFile";} //获取共享文件名 std::string shmname() const{return shmname_;} //打开文件 //shmname: 共享文件名,应该以'/'开头,例如"/shmname",实际位置可能是"/dev/shm/shmname" //flags: 参考shm_open(2)的flags参数 //mode: 参考shm_open(2)的mode参数 //return: // true 成功 // false 失败 //TODO:unit test bool open(const char * shmname, int flags = kFlagsDefault, mode_t mode = kModeDefault){ if(NULL == shmname) return false; if(valid()) this->close(); fd_ = ::shm_open(shmname, flags, mode); shmname_ = shmname; return valid(); } bool open(const std::string & shmname, int flags = kFlagsDefault, mode_t mode = kModeDefault){ return this->open(shmname.c_str(), flags, mode); } //删除文件 bool unlink(){ if(!valid()) return false; return Unlink(shmname()); } //内部状态描述,主要用于log std::string toString() const{ CToString oss; oss<<"{CFile="<<CFile::toString() <<", shmname_="<<shmname_ <<"}"; return oss.str(); } private: std::string shmname_; }; NS_SERVER_END #endif
26  CPosixShmFile(){}
27  //TODO:unit test
28  explicit CPosixShmFile(const char * shmname,
29  int flags = __MyBase::kFlagsDefault,
30  mode_t mode = __MyBase::kModeDefault){
31  this->open(shmname, flags, mode);
32  }
33  explicit CPosixShmFile(const std::string & shmname,
34  int flags = __MyBase::kFlagsDefault,
35  mode_t mode = __MyBase::kModeDefault){
36  this->open(shmname, flags, mode);
37  }
38  CPosixShmFile(const CPosixShmFile & other){__MyBase::copyFrom(other);}
39  CPosixShmFile & operator =(const CPosixShmFile & other){
40  __MyBase::copyFrom(other);
41  return *this;
42  }
43  //返回fd类型和名称 int fdType() const{return kFdType;} const char * fdTypeName() const{return "CPosixShmFile";} //获取共享文件名 std::string shmname() const{return shmname_;} //打开文件 //shmname: 共享文件名,应该以'/'开头,例如"/shmname",实际位置可能是"/dev/shm/shmname" //flags: 参考shm_open(2)的flags参数 //mode: 参考shm_open(2)的mode参数 //return: // true 成功 // false 失败 //TODO:unit test bool open(const char * shmname, int flags = kFlagsDefault, mode_t mode = kModeDefault){ if(NULL == shmname) return false; if(valid()) this->close(); fd_ = ::shm_open(shmname, flags, mode); shmname_ = shmname; return valid(); } bool open(const std::string & shmname, int flags = kFlagsDefault, mode_t mode = kModeDefault){ return this->open(shmname.c_str(), flags, mode); } //删除文件 bool unlink(){ if(!valid()) return false; return Unlink(shmname()); } //内部状态描述,主要用于log std::string toString() const{ CToString oss; oss<<"{CFile="<<CFile::toString() <<", shmname_="<<shmname_ <<"}"; return oss.str(); } private: std::string shmname_; }; NS_SERVER_END #endif
44  int fdType() const{return kFdType;}
45  const char * fdTypeName() const{return "CPosixShmFile";}
46  //获取共享文件名
47  std::string shmname() const{return shmname_;}
48  //打开文件
49  //shmname: 共享文件名,应该以'/'开头,例如"/shmname",实际位置可能是"/dev/shm/shmname"
50  //flags: 参考shm_open(2)的flags参数 //mode: 参考shm_open(2)的mode参数 //return: // true 成功 // false 失败 //TODO:unit test bool open(const char * shmname, int flags = kFlagsDefault, mode_t mode = kModeDefault){ if(NULL == shmname) return false; if(valid()) this->close(); fd_ = ::shm_open(shmname, flags, mode); shmname_ = shmname; return valid(); } bool open(const std::string & shmname, int flags = kFlagsDefault, mode_t mode = kModeDefault){ return this->open(shmname.c_str(), flags, mode); } //删除文件 bool unlink(){ if(!valid()) return false; return Unlink(shmname()); } //内部状态描述,主要用于log std::string toString() const{ CToString oss; oss<<"{CFile="<<CFile::toString() <<", shmname_="<<shmname_ <<"}"; return oss.str(); } private: std::string shmname_; }; NS_SERVER_END #endif
51  //mode: 参考shm_open(2)的mode参数 //return: // true 成功 // false 失败 //TODO:unit test bool open(const char * shmname, int flags = kFlagsDefault, mode_t mode = kModeDefault){ if(NULL == shmname) return false; if(valid()) this->close(); fd_ = ::shm_open(shmname, flags, mode); shmname_ = shmname; return valid(); } bool open(const std::string & shmname, int flags = kFlagsDefault, mode_t mode = kModeDefault){ return this->open(shmname.c_str(), flags, mode); } //删除文件 bool unlink(){ if(!valid()) return false; return Unlink(shmname()); } //内部状态描述,主要用于log std::string toString() const{ CToString oss; oss<<"{CFile="<<CFile::toString() <<", shmname_="<<shmname_ <<"}"; return oss.str(); } private: std::string shmname_; }; NS_SERVER_END #endif
52  //return:
53  // true 成功
54  // false 失败 //TODO:unit test bool open(const char * shmname, int flags = kFlagsDefault, mode_t mode = kModeDefault){ if(NULL == shmname) return false; if(valid()) this->close(); fd_ = ::shm_open(shmname, flags, mode); shmname_ = shmname; return valid(); } bool open(const std::string & shmname, int flags = kFlagsDefault, mode_t mode = kModeDefault){ return this->open(shmname.c_str(), flags, mode); } //删除文件 bool unlink(){ if(!valid()) return false; return Unlink(shmname()); } //内部状态描述,主要用于log std::string toString() const{ CToString oss; oss<<"{CFile="<<CFile::toString() <<", shmname_="<<shmname_ <<"}"; return oss.str(); } private: std::string shmname_; }; NS_SERVER_END #endif
55  //TODO:unit test
56  bool open(const char * shmname, int flags = kFlagsDefault, mode_t mode = kModeDefault){
57  if(NULL == shmname)
58  return false;
59  if(valid())
60  this->close();
61  fd_ = ::shm_open(shmname, flags, mode);
62  shmname_ = shmname;
63  return valid();
64  }
65  bool open(const std::string & shmname, int flags = kFlagsDefault, mode_t mode = kModeDefault){
66  return this->open(shmname.c_str(), flags, mode);
67  }
68  //删除文件
69  bool unlink(){
70  if(!valid())
71  return false;
72  return Unlink(shmname());
73  }
74  //内部状态描述,主要用于log
75  std::string toString() const{
76  CToString oss;
77  oss<<"{CFile="<<CFile::toString()
78  <<", shmname_="<<shmname_
79  <<"}";
80  return oss.str();
81  }
82 private:
83  std::string shmname_;
84 };
85 
86 NS_SERVER_END
87 
88 #endif
89 
std::string toString() const
Get readable description of this object.
Definition: file.hh:400
bool valid() const
Test if this object is a valid file descriptor.
Definition: file.hh:65
const char * fdTypeName() const
Get readable description of this object.
Definition: posix_shm_file.hh:45
Abstract interface of fd (file descriptor).
Definition: file.hh:43
Definition: to_string.hh:43
Definition: posix_shm_file.hh:10
Encapsulation for fd (file descriptor) and regular files.
std::string toString() const
Get readable description of this object.
Definition: posix_shm_file.hh:75
Regular file operations.
Definition: file.hh:181
bool unlink()
Remove file.
Definition: posix_shm_file.hh:69
void close()
Close this fd.
Definition: file.hh:153
int fdType() const
Get type id of this object.
Definition: posix_shm_file.hh:44