shm_open - ライブラリコールの説明 - Linux コマンド集 一覧表
- 名前
- 書式
- 説明
- 返り値
- エラー
- 注意
- 準拠
- 関連項目
名前
shm_open, shm_unlink - POSIX 共有メモリ・オブジェクトの作成/オープンと削除 (unlink)
書式
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
/* O_* 定数の定義用 */
void * shm_open(const char *
name
, int
oflag
, mode_t
mode
);
int shm_unlink(const char *
name
);
説明
shm_open
()は、POSIX 共有メモリ・オブジェクトを新規に作成しオープンしたり、
すでに存在するオブジェクトをオープンしたりする。
POSIX 共有メモリ・オブジェクトは、実際には、関係のないプロセスが
共有メモリの同じ領域を
mmap
(2) するために使用することができる手段である。
shm_unlink
()は、逆の操作、つまり以前に
shm_open
()で作成されたオブジェクトの削除を行う。
shm_open
()の動作は
open
(2) とよく似ている。
name
で作成したりオープンしたりする共有メモリ・オブジェクトを指定する。
移植性を持たせるためには、
name
はスラッシュ (/) から始まるものにし、途中にはスラッシュを含まないように
すべきである。
oflag
はビットマスクで、
O_RDONLY
と
O_RDWR
のいずれか一方と、以下に述べる他のフラグの論理和をとったもの
を指定する。
-
O_RDONLY
-
読み出しアクセス用にオブジェクトをオープンする。
このフラグを指定してオープンされた共有メモリ・オブジェクトは、
読み出し (PROT_READ
) アクセスでのみ
mmap
(2) することができる。
-
O_RDWR
-
読み書きアクセス用にオブジェクトをオープンする。
-
O_CREAT
-
存在しない場合、共有メモリ・オブジェクトを作成する。
オブジェクトのユーザとグループの所有権は、
呼び出し元プロセスの対応する実効 ID が使われ、
オブジェクトの許可ビットは
mode
の下位 9 ビットに基づいて設定される。ただし、
ファイルモード作成マスク
(
umask
(2)参照) に設定されている値は、新規オブジェクトに関してはクリアされる。
mode
を定義するために使用できるマクロ定数(群)は
open
(2) に記載されている。
新規に作成された共有メモリ・オブジェクトは長さ 0 で初期化される。
オブジェクトの大きさは
ftruncate
(2)を使って設定できる。
共有メモリ・オブジェクトとして新規に確保されたバイトは自動的に
0 に初期化される。
-
O_EXCL
-
O_CREAT
が一緒に指定されており、
name
で指定された共有メモリ・オブジェクトが既に存在した場合、
エラーを返す。
オブジェクトの存在確認と、存在しなかった場合のオブジェクト作成は、
必ず一連の操作として実行される (performed atomically)。
-
O_TRUNC
-
共有メモリ・オブジェクトがすでに存在した場合、
そのオブジェクトを 0 バイトに切り詰める。
成功して完了した場合、
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 以降で提供されている。
これらの関数を使ったプログラムでは、必要な ("realtime") ライブラリを
リンクするために
cc
に
-lrt
フラグを指定しなければならない。
POSIX は
O_RDONLY
と
O_TRUNC
が一緒に指定された場合の動作を未定義にしている。Linux では、
既存の共有メモリ・オブジェクトに対する切り詰め (truncate) は成功する。
しかし、他の Unix システムでも同じであるとは限らない。
Linux 2.4 における POSIX 共有メモリ・オブジェクトの実装は
専用のファイルシステムを使用する。そのファイルシステムは通常
/dev/shm
にマウントされる。
準拠
POSIX.1-2001.
POSIX.1-2001 には、新規に作成される共有メモリオブジェクトのグループ所有権は、
呼び出し元プロセスの実効グループ ID か 「システムのデフォルトのグループ ID」
のどちらかに設定される、と書かれている。
関連項目
- Linux Tips 関連記事
- Linux Tips(目次)
- Linux ディストリビューション一覧
- rpm のファイル名にあるi386とかi686とは
- 自分のマシンの情報を調べる
- cron の設定
- ssh の root ログインを禁止する
- ssh を、ユーザ、IPでアクセス制限
- 鍵交換方式によるssh接続
- 鍵交換方式によるssh接続( windowsから )
- 複数ファイル内の文字列を置換して上書き保存する
- あるグループをイニシャルグループとするユーザー一覧出力
- 複数ファイルのファイル名を一括変換する
- 連番ファイルをコマンド一発で作成する
- 中身がランダムなファイルを任意のサイズで作成する
- Linux ユーザーアカウントをロック・アンロックする