Slip Ahead Logging

It's not your fault at all.

getpagesize(2) はレガシー

ページサイズの取得について getpagesize(2) の map ページには次のようにある.

SVr4, 4.4BSD, SUSv2. In SUSv2 the getpagesize() call is
labeled LEGACY, and in POSIX.1-2001 it has been dropped;
HP-UX does not have this call. Portable applications should
employ sysconf(_SC_PAGESIZE) instead of this call.

getpagesize(2) はレガシーなので sysconf(2) を使いましょうと.

#include <unistd.h>
long sz = sysconf(_SC_PAGESIZE);

ちなみに mmap(2) で設定するメモリのオフセットをページサイズの倍数としなければならない理由を先日知った.これは mmap が OS の用意する仮想記憶の仕組みをそのまま使っているため.メモリの割当先としてスワップ領域ではなくディスクリプタで指定された特定のファイルを用いている.ユーザが mmap により割り当てられたページへアクセスした際にページフォルトが発生し,そこではじめてファイルから特定部分の読み込みがおこなわれると(あれ,書いていて思ったが整数倍でないと都合が悪いのか?).

mmap (メモリマップトファイル) : kei@sodan のスライドが恐ろしくわかりやすい.