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は「互換性のためのフラグ。無視される。」とのこと。不要だった。