EN JA
SHM_OPEN(2)
SHM_OPEN(2) FreeBSD System Calls Manual SHM_OPEN(2)

名称

shm_open, shm_unlink共有メモリオブジェクト操作

ライブラリ

Standard C Library (libc, -lc)

書式

#include < sys/types.h>
#include < sys/mman.h>
#include < fcntl.h>

int
shm_open( const char *path, int flags, mode_t mode);

int
shm_unlink( const char *path);

解説

shm_open() システムコールは、 path で指定された POSIX 共有メモリオブジェクトをオープン (するか、オプションで作成) します。 flags 引数は、 open(2) によって使用されるフラグのサブセット (部分集合) を含んでいます。 O_RDONLY または O_RDWR のいずれかのアクセスモードが、 flags に含まれなければなりません。また、オプションのフラグ O_CREAT, O_EXCLO_TRUNC も指定できます。

O_CREAT が指定されるなら、 path で指定される共有メモリオブジェクトは、存在していないなら、作成されます。この場合、共有メモリオブジェクトは、プロセスの umask 値に従ってモード mode で作成されます。 O_CREATO_EXCL フラグの両方が指定されて、 path で指定された共有メモリオブジェクトが既に存在しているなら、 shm_open() は、 EEXIST で失敗します。

新しく作成されたオブジェクトは、0 のサイズで始めます。既存の共有メモリオブジェクトが O_RDWR でオープンされ、 O_TRUNC フラグが指定されているなら、共有メモリオブジェクトは、0 のサイズに切り詰められます。オブジェクトのサイズを ftruncate(2) を通して調整でき、 fstat(2) を通して問い合わせすることができます。

新しい記述子は、 execve(2) システムコールの間にクローズするように設定されます。 close(2)fcntl(2) を参照してください。

FreeBSD の拡張として、定数 SHM_ANON は、 shm_open() への path 引数に使用されます。この場合、匿名で、無名の共有メモリオブジェクトが、作成されます。オブジェクトには名前がないので、 shm_unlink() へのその後の呼び出しでそれを削除することはできません。代わりに、共有メモリオブジェクトは、共有メモリオブジェクトの最後の参照が削除されるとき、集められたゴミになります。共有メモリオブジェクトは、 fork(2) または sendmsg(2) を通してファイル記述子を共有することによって、他のプロセスと共有されます。 O_RDONLY をつけて匿名の共有メモリオブジェクトをオープンを試みることは、 EINVAL で失敗します。他のすべてのフラグは、無視されます。

shm_unlink() システムコールは、 path で指定された共有メモリオブジェクトを削除します。

戻り値

成功するなら、 shm_open() は、負でない整数を返し、 shm_unlink() は、0 を返します。両方の関数は、失敗すれば -1 を返し、 errno にエラーを示す値が設定されます。

互換性

path 引数は、(ほとんどの他の実装ではそうしますが) 必ずしもパス名を表すというわけではありません。同じ path をオープンする 2 つのプロセスは、 path が、スラッシュ (‘ /’) 文字で始まる時かつその時に限り、同じ共有メモリオブジェクトにアクセスすることが保証されます。

O_RDONLY, O_RDWR, O_CREAT, O_EXCLO_TRUNC フラグのみ、移植性のあるプログラムで使用することができます。

共有メモリオブジェクトで、または shm_open() によって返された記述子で open(2), read(2), または write(2) を使用した結果は、未定義です。また、リブートに渡って持続する、共有メモリオブジェクト自体であろうとその内容であろうと、未定義です。

FreeBSD では、共有メモリオブジェクト上の read(2)write(2) は、 EOPNOTSUPP で失敗し、共有メモリオブジェクトとリブートに渡って持続するそれらの内容のどちらでもありません。

エラー

次のエラーが、 shm_open() のために定義されています:
[ EINVAL]
O_RDONLY, O_RDWR, O_CREAT, O_EXCL または O_TRUNC 以外のフラグが、 flags に含まれていました。
[ EMFILE]
プロセスが、オープンファイル記述子のための制限にとっくに到達しました。
[ ENFILE]
システムファイルテーブルが、満杯です。
[ EINVAL]
O_RDONLY が、 SHM_ANON を通して匿名の共有メモリオブジェクトを作成している間に指定されました。
[ EFAULT]
path 引数が、プロセスの割り付けられたアドレス空間の外側を指しています。
[ ENAMETOOLONG]
全体のパス名が、1023 文字を超えました。
[ EINVAL]
path が、スラッシュ (‘ /’) 文字で始まっていません。
[ ENOENT]
O_CREAT が、指定され、名前のある共有メモリオブジェクトが、存在していません。
[ EEXIST]
O_CREATO_EXCL が、指定され、名前のある共有メモリオブジェクトが、存在してます。
[ EACCES]
(読み込み、または読み込み書き込みのための) 要求されたパーミッションが、拒否されました。

次のエラーが、 shm_unlink() のために定義されています:

[ EFAULT]
path 引数が、プロセスの割り付けられたアドレス空間の外側を指しています。
[ ENAMETOOLONG]
全体のパス名が、1023 文字を超えました。
[ ENOENT]
名前のある共有メモリオブジェクトが、存在していません。
[ EACCES]
要求されたパーミッションが、拒否されました。 shm_unlink() が、共有メモリオブジェクトへの書き込みパーミッションを要求しました。

規格

shm_open() と shm_unlink() 関数は、 IEEE Std 1003.1b-1993 (“POSIX.1b”) に適合すると確信しています。

歴史

shm_open() と shm_unlink() 関数は、 FreeBSD 4.3 ではじめて登場しました。関数は、 FreeBSD 7.0 のファイルよりむしろ直接共有メモリオブジェクトを使用するシステムコールとして再実装されました。

作者

Garrett A. Wollman <wollman@FreeBSD.org> (C ライブラリサポートとこのマニュアルページ)

Matthew Dillon <dillon@FreeBSD.org> ( MAP_NOSYNC)

March 20, 2007 FreeBSD