mmap用のクラス

mmapは便利なので(C++を使うときは)割合よく利用する。
ただ、初期化が面倒で毎回リファレンスなどを調べるはめになるので、クラス(struct)としてまとめておくことにする。
  ↓

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

struct mmap_t{
  mmap_t(const char* path, bool write_mode=false, int flags=MAP_FILE|MAP_PRIVATE){
    int OPEN_MODE=O_RDONLY;
    int PROT = PROT_READ;
    if(write_mode) {
      OPEN_MODE=O_RDWR;
      PROT |= PROT_WRITE;
    }
    
    int f = open(path, OPEN_MODE);
    struct stat statbuf;
    fstat(f, &statbuf);
    ptr = mmap(0, statbuf.st_size, PROT, flags, f, 0);
    size=statbuf.st_size;
    close(f);  
  }

  ~mmap_t() {
    munmap(ptr, size);
  }

  operator bool () const 
  { return reinterpret_cast<int>(ptr)!=-1; }

  size_t size;
  void *ptr;
};


使用例

mmap_t mm("/etc/hosts");
if(mm) {
  write(1, mm.ptr, mm.size);
}

追記(2009/10/01)

manのmmapのページを見たら、(上でflagsにデフォルトで渡している)MAP_FILEは「互換性のためのフラグ。無視される。」とのこと。不要だった。