MLOCK(2)

名前
mlock - メモリの一部のページングを禁止する

書式
#include <sys/mman.h>

int mlock(const void *addr, size_t len);

説明
mlock は addr から始まる長さ len バイトの範囲のメモリのページング(paging)を禁止する。 mlock システム・コールが成功した場合には指定された範囲にあるメモリは RAM に 残り続けることが保証される、そして munlock や munlockall によってページがアンロックされたり、プロセスが終了したり、 exec によって他のプログラムを開始したりするまでは RAM に残る。 fork を行なった場合に子プロセスはページのロックを継承しない。 メモリのロックには主に二つの使い道がある。リアル・タイム(real-time) アルゴリズムと高いセキュリティの必要なデータ処理である。リアル・タイムの アプリケーションは決定的なタイミングやスケジューリングを要求し、 ページングは予期しないプログラムの実行遅れをもたらす主要な要因である。 リアル・タイムのアプリケーションはたいていは sched_setscheduler でリアル・タイム・スケジュラーに変更される。 暗号やセキュリティのソフトウェアはしばしばパスワードや秘密鍵のデータの のような重要なデータを扱う。ページングの結果、これらの秘密が スワップ用の固定媒体に転送されるかもしれない。そしてそれはセキュリティ ・ソフトウェアが RAM 上の秘密を削除して終了したずっと後にでも敵によって アクセスが可能になるかもしれない。 メモリのロック(lock)は累積しない。例えば複数回 mlock や mlockall を呼び出してロックされたページも一回の対応する範囲の munlock の呼び出しや munlockall によってアンロック(unlock)される。 複数の場所や複数のプロセスにマップされているページは、少なくとも一つの場所、 一つのプロセスでロックされている限りは RAM に残り続ける。 mlock と munlock が使用可能である POSIX システムでは _POSIX_MEMLOCK_RANGE が <unistd.h> に定義されており、<limits.h> にある PAGESIZE の値はページ当りのバイト数を示している。

返り値
成功した場合は、 mlock はゼロを返す。エラーの場合は -1 が返され、 errno が適切に設定され、プロセスのアドレス空間におけるロックは変更されない。

エラー

ENOMEM
    指定されたアドレス範囲がプロセスのアドレス空間にマップされたページと 一致しないか、許される上限を超える数のページをロックしようとした

EPERM
    呼び出したプロセスが必要な特権を所有していなかった。 スーパー・ユーザーのプロセスのみが ページをロックすることができる。

EINVAL
    len が正の数でない。

準拠
POSIX.1b, SVr4. SVr4 には他に EAGAIN エラーについての記述がある。

関連項目
munlock(2), mlockall(2), munlockall(2).