Provided by: manpages-ja-dev_0.5.0.0.20210215+dfsg-1_all
名前
shm_open, shm_unlink - POSIX 共有メモリーオブジェクトの作成/オープン/削除を行う
書式
#include <sys/mman.h> #include <sys/stat.h> /* mode 定数用 */ #include <fcntl.h> /* O_* 定数の定義用 */ int shm_open(const char *name, int oflag, mode_t mode); int shm_unlink(const char *name); -lrt でリンクする。
説明
shm_open() は、POSIX 共有メモリーオブジェクトを新規に作成/オープンしたり、 すでに存在する オブジェクトをオープンしたりする。 POSIX 共有メモリーオブジェクトは、実際には、関係のない プロセスが 共有メモリーの同じ領域を mmap(2) するために使用することができる手段である。 shm_unlink() は、逆の操作、つまり以前に shm_open() で作成されたオブジェクトの削除を行う。 shm_open() の動作は open(2) とよく似ている。 name で作成したりオープンしたりする共有メモ リーオブジェクトを指定する。 移植性を持たせるためには、共有メモリーオブジェクトは /somename という形式の名前で識別し、 その名前は、最大で NAME_MAX (すなわち 255) 文字のヌル 終端された文字列で、 スラッシュで始まり、スラッシュ以外の文字が 1 文字以上続く形式 にすべ きである。 oflag はビットマスクで、 O_RDONLY と O_RDWR のいずれか一方と、以下に述べる他のフラグの論理 和をとったもの を指定する。 O_RDONLY 読み出しアクセス用にオブジェクトをオープンする。 このフラグを指定してオープンさ れた共有メモリーオブジェクトは、 読み出し (PROT_READ) アクセスでのみ mmap(2) することができる。 O_RDWR 読み書きアクセス用にオブジェクトをオープンする。 O_CREAT 存在しない場合、共有メモリーオブジェクトを作成する。 オブジェクトのユーザーとグ ループの所有権は、 呼び出し元プロセスの対応する実効 ID が使われ、 オブジェクト の許可ビットは mode の下位 9 ビットに基づいて設定される。ただし、 ファイルモー ド作成マスク (umask(2) 参照) に設定されている値は、新規オブジェクトに関してはク リアされる。 mode を定義するために使用できるマクロ定数(群)は open(2) に記載さ れている (これらの定数のシンボル定義は <sys/stat.h> のインクルードにより得られ る)。 新規に作成された共有メモリーオブジェクトは長さ 0 で初期化される。 オブジェクト の大きさは ftruncate(2) を使って設定できる。 共有メモリーオブジェクトとして新 規に確保されたバイトは自動的に 0 に初期化される。 O_EXCL O_CREAT が一緒に指定されており、 name で指定された共有メモリーオブジェクトが既 に存在した場合、 エラーを返す。 オブジェクトの存在確認と、存在しなかった場合の オブジェクト作成は、 必ず一連の操作として実行される (performed atomically)。 O_TRUNC 共有メモリーオブジェクトがすでに存在した場合、 そのオブジェクトを 0 バイトに切 り詰める。 これらのフラグ値の定義は <fcntl.h> のインクルードにより得られる。 成功して完了した場合、 shm_open() は共有メモリーオブジェクトを参照する新しいファイルディ スクリプターを返す。 このファイルディスクリプターは、そのプロセス内で過去にオープンされて いない ファイルディスクリプターの中で最も小さな数になることが保証される。 FD_CLOEXEC フラ グ (fcntl(2) を参照) が、このファイルディスクリプターに設定される。 通常、これらのファイルディスクリプターは、この後続けて実行される ftruncate(2) (新規に作成 されたオブジェクトの場合のみ) と mmap(2) の呼び出しに使用される。 mmap(2) を呼び出した後 は、ファイルディスクリプターをクローズしてもよく、 クローズしてもメモリーマッピングに影響 を与えることはない。 shm_unlink() の動作は unlink(2) とよく似ている: 共有メモリーオブジェクト名を削除し、すべ てのプロセスが処理対象の オブジェクトをアンマップした時点でオブジェクトの割り当てを解除 し、 対応するメモリー領域の内容を破棄する。 shm_unlink() が成功した後で、同じ name を持つ オブジェクトに対して shm_open() を行うと、 (O_CREAT が指定されていない場合) 失敗する。 (O_CREAT が指定されている場合、新しく別のオブジェクトが作成される)。
返り値
成功した場合、 shm_open() は非負のファイルディスクリプターを返す。 失敗した場合、 shm_open() は -1 を返す。 shm_unlink() は、成功した場合 0 を、エラーが起こった場合 -1 を 返す。
エラー
失敗した場合、エラーの原因を示すため errno が設定される。 errno に設定される値は以下の通り である: EACCES 共有メモリーオブジェクトを shm_unlink() する権限がなかった。 EACCES 指定された mode で name を shm_open() する権限がなかった。もしくは、 O_TRUNC が指 定されたが、呼び出し元にはそのオブジェクトに対する書き込み権限が なかった。 EEXIST O_CREAT と O_EXCL の両方が shm_open() に指定されたが、 name で指定された共有メモ リーオブジェクトが既に存在した。 EINVAL shm_open() に与えられた name 引き数が不正であった。 EMFILE プロセスがオープン可能なファイル数の上限にすでに達していた。 ENAMETOOLONG name の長さが PATH_MAX を越えている。 ENFILE ファイルシステムでオープンできるファイル数の上限に達した。 ENOENT 存在していない name のオブジェクトを shm_open() しようとしたが、 O_CREAT が指定さ れていなかった。 ENOENT 存在しない name のオブジェクトを shm_unlink() しようとした。
バージョン
これらの関数は glibc 2.2 以降で提供されている。
準拠
POSIX.1-2001. POSIX.1-2001 には、新規に作成される共有メモリーオブジェクトのグループ所有権は、 呼び出し元 プロセスの実効グループ ID か 「システムのデフォルトのグループ ID」 のどちらかに設定され る、と書かれている。
注意
POSIX は O_RDONLY と O_TRUNC が一緒に指定された場合の動作を未定義にしている。Linux では、 既存の共有メモリーオブジェクトに対する切り詰め (truncate) は成功する。 しかし、他の UNIX システムでも同じであるとは限らない。 Linux 2.4 における POSIX 共有メモリーオブジェクトの実装は 専用のファイルシステムを使用す る。そのファイルシステムは通常 /dev/shm にマウントされる。
関連項目
close(2), fchmod(2), fchown(2), fcntl(2), fstat(2), ftruncate(2), memfd_create(2), mmap(2), open(2), umask(2), shm_overview(7)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。