minherit(2) FreeBSD 一般コマンドマニュアル

minherit

前のページ 上に戻る 次のページ

minherit




書式

     #include <sys/types.h>
     #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 引数によって指定されたページに対して適切ではありま
                        せんでした。


ABELNET VPSサービス