Amazon | POSIX.4 Programmers Guide: Programming for the Real World | Gallmeister, Bill | Unix
この本がほしい
MAP_PRIVATE はファイルに反映されない
いじっている間はファイルに絶対反映されないけど、munmap()すれば反映される。 と思い込んでた。
Man page of MMAP
マニュアルをいくら読んでもわからなかったので随分悩んだ。
mmap - Wikipedia
でもWikipediaにはそのものずばり書いてある。
ファイルサイズは勝手に大きくならない
小さいファイルをmmap()して後ろの方になんか書いたら反映されて ファイルもついでに拡張されないかなー と期待してた。
なんならサイズが 0 のファイルでアクセスした日には バスエラーまで起こる。
サイズをページサイズに合わせる
int size = 4097; int pagesize = sysconf(_SC_PAGESIZE); // ほぼほぼ 4096 int alignedsize = ((size-1)/pagesize + 1) * pagesize; // この例なら 8192 になる
いちいち (size/pagesize + (size%pagesize!=0)) * pagesize とかやってたけど、この方が短くてかっこいい
サイズをページサイズに合わせなくても大丈夫
mmap() のときのlengthは ページサイズに勝手に切り上げて合わせるよ! とマニュアルに書いてあるけど、
munmap() にはページサイズに合わせなさい。 と書いてあるので、マジかよ面倒くさいと思っていた。
が、単に誤読で、ページサイズにあわせないといけないのはアドレスだった。
サイズの方は内部で勝手に切り上げてるっぽいので平気。 よって、ページサイズを使ってサイズ計算する必要は無くなった
linux/mmap.c at master · torvalds/linux · GitHub
int __do_munmap(struct mm_struct *mm, unsigned long start, size_t len, struct list_head *uf, bool downgrade) { unsigned long end; struct vm_area_struct *vma, *prev, *last; if ((offset_in_page(start)) || start > TASK_SIZE || len > TASK_SIZE-start) return -EINVAL; len = PAGE_ALIGN(len); 以下略