bionic (3) shm_open.3.gz

Provided by: manpages-ja-dev_0.5.0.0.20161015+dfsg-1_all bug

名前

       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_RDONLYO_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 指定された modenameshm_open()  する権限がなかった。もしくは、 O_TRUNC が指定されたが、呼び
              出し元にはそのオブジェクトに対する書き込み権限が なかった。

       EEXIST O_CREATO_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_RDONLYO_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/ に書かれている。