スポンサーリンク

MINHERIT(2) FreeBSD システムコールマニュアル MINHERIT(2)

名称

minherit − ページの継承を制御する

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <sys/mman.h>

int

minherit(void *addr, size_t len, int inherit);

解説

minherit() システムコールは、指定のページが継承の際の特性として inherit を持つように変更します。すべての実装において、継承の際の特性がページ単位 で設定できることが保証されるているわけではありません。変更の単位はリー ジョン全体かもしれません。 FreeBSD は、ページ毎に継承特性を調整する機能を 持ちます。継承は、 fork() で作成された子供に対してのみ影響します。 exec() には影響ありません。 exec されたプロセスは、アドレス空間全体を置き換えま す。このシステムコールは親のアドレス空間に対してもまた影響ありません (親 子によるアドレス空間の共有は潜在的にあり得ますが、これは除外します)。

継承は難解な機能であり、ほとんどが mmap() の MAP_SHARED 機能で置き換えら れています。しかしながら、 minherit() を使用して、 MAP_PRIVATE でマップさ れたメモリブロックを親子間で共有可能です。これにより、親もしくは子による 修正は共有されますが、元々下層にあるファイルは変更されません。

       INHERIT_SHARE

本オプションは、対象のアドレス空間を親子間で共有させます。 本オプションは、元々下層にあるバッキングストアがどのように マップされるかには、影響しません。

INHERIT_NONE
本オプションは、対象のアドレス空間の継承を完全に防止しま す。当該アドレス空間は子の中ではアンマップされます。

INHERIT_COPY
本オプションは、アドレス空間を子に対しコピーオンライトで継 承させます。本オプションには不幸な副作用があり、親が fork するときにアドレス空間がコピーオンライトになってしまいま す。元々のマッピングが MAP_SHARED の場合、親が fork した後 にはこれは親においては共有されません。また、元の共有バッキ ングストアマッピングは、親においてアンマップして再マップす る以外に回復しようがありません。

戻り値

関数 minherit() は、処理が成功すると値 0 を返します。そうでない場合、値 -1 が返され、グローバル変数 errno が設定されてエラーを示します。

エラー

minherit() システムコールは次の場合に処理を失敗します:

       [EINVAL]

addr 引数と len 引数によって指定される仮想アドレス範囲 が有効ではありません。

[EACCES]
inherit
引数によって指定されるフラグが、 addr 引数と len 引数によって指定されたページに対して適切ではありま せんでした。

バグ

一度 MAP_PRIVATE もしくは MAP_SHARED しているものに継承を設定すると、領域 をアンマップして再マップする以外にもともとのコピーオンライトの意味を回復 させることはできません。

関連項目

fork(2), madvise(2), mincore(2), mprotect(2), msync(2), munmap(2), rfork(2)

歴史

minherit() システムコールは OpenBSD ではじめて登場しました。

FreeBSD 10.0 February 17, 1996 FreeBSD 10.0

スポンサーリンク