bionic (2) shmget.2.gz

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

名前

       shmget - System V 共有メモリーセグメントを割り当てる

書式

       #include <sys/ipc.h>
       #include <sys/shm.h>

       int shmget(key_t key, size_t size, int shmflg);

説明

       shmget()   は key 引き数に対応する System V 共有メモリーセグメントの識別子を返す。 key の値が IPC_PRIVATE
       の場合、もしくは key に対応する共有メモリーセグメントが存在せず、 shmflgIPC_CREAT  が指定されていた場
       合、   新しい共有メモリーセグメントを作成する。  作成される共有メモリーセグメントは、  size  引き数の値を
       PAGE_SIZE の倍数へと切り上げた (round up) 大きさとなる。

       shmflgIPC_CREATIPC_EXCL の両方が指定された場合、 key に対応する共有メモリーセグメントが既に存在す
       ると、  shmget()  は失敗し、 errnoEEXIST が設定される (これは open(2)  に O_CREAT | O_EXCL を指定した
       場合の動作と同じである)。

       shmflg は以下の内容から構成される:

       IPC_CREAT   新しいセグメントを作成する。このフラグが指定されなかった場合、 shmget()  は key  に対応するセ
                   グメントを探し、 ユーザーがそのセグメントにアクセスする許可があるかどうかをチェックする。

       IPC_EXCL    このフラグは  IPC_CREAT  とともに使用し、  この呼び出しで確実にセグメントが作成されるようにす
                   る。 セグメントが既に存在した場合には、 呼び出しは失敗する。

       SHM_HUGETLB (Linux 2.6 以降)
                   "ヒュージページ (huge page)" を使うセグメントを割り当てる。詳細な情報は、Linux カーネルソース
                   のファイル Documentation/vm/hugetlbpage.txt を参照。

       SHM_NORESERVE (Linux 2.6.15 以降)
                   このフラグは、  mmap(2)  の MAP_NORESERVE フラグと同じ役割を果たす。 このセグメントに対するス
                   ワップ空間の予約を行わない。 スワップ空間を予約した場合は、そのセグメントの変更が必ず成功する
                   ことが  保証される。スワップ空間の予約を行わなかった場合は、物理メモリーに空きが ないと書き込
                   み時に SIGSEGV を受け取る可能性がある。 proc(5)  にある /proc/sys/vm/overcommit_memory ファイ
                   ルに関する議論も参照のこと。

       上記のフラグに加えて、  shmflg  の下位  9 ビットは、所有者、グループ、その他への許可を指定する。 これらの
       ビットは open(2) の mode 引き数と同じ形式で同じ意味を持つ。 今のところ、システムは実行 (execute) 許可を参
       照しない。

       共有メモリーセグメントが新たに作成される際、 共有メモリーセグメントの内容は 0 で初期化され、 関連情報を保
       持するデータ構造体 shmid_ds は以下のように初期化される。

              shm_perm.cuidshm_perm.uid に呼び出し元プロセスの実効 (effective) ユーザーID を設定する。

              shm_perm.cgidshm_perm.gid に呼び出し元プロセスの実効グループID を設定する。

              shm_perm.mode の下位 9 ビットに shmflg の下位 9 ビットを設定する。

              shm_segszsize の値を設定する。

              shm_lpid, shm_nattch, shm_atime, shm_dtime に 0 を設定する。

              shm_ctime に現在の時刻を設定する。

       共有メモリーセグメントが既に存在する場合、アクセス許可の検査と、 破壊 (destruction)  マークがつけられてい
       ないかのチェックが行われる。

返り値

       成功の場合、有効な共有メモリーセグメントの識別子が返される。  エラーの場合、 -1 が返り、 errno にエラーを
       示す値が設定される。

エラー

       失敗した場合は errno が以下のどれかに設定される:

       EACCES ユーザーはその共有メモリーセグメントへのアクセス許可を持たず、 CAP_IPC_OWNER  ケーパビリティも持っ
              ていない。

       EEXIST IPC_CREATIPC_EXCLshmflg に指定されたが、 key に対応する共有メモリーセグメントはすでに存在
              する。

       EINVAL 新しいセグメントを作成しようとしたが、 sizeSHMMIN より小さいか SHMMAX よりも大きかった。

       EINVAL 指定された key に対応するセグメントが既に存在するが、 size  がそのセグメントのサイズよりも大きかっ
              た。

       ENFILE システム全体でオープンされているファイルの総数が上限に達した。

       ENOENT 指定された key に対応するセグメントが存在せず、 IPC_CREAT も指定されていなかった。

       ENOMEM セグメントの管理情報 (overhead) に割り当てるメモリーがなかった。

       ENOSPC システム全体の共有メモリーセグメント数の制限  (SHMMNI)  に達した、または要求された size のセグメン
              トの割り当てが システム全体の共有メモリーサイズの制限 (SHMALL)  を超過した。

       EPERM  SHM_HUGETLB フラグが指定されたが、呼び出し元には権限がなかった (CAP_IPC_LOCK  ケーパビリティを持っ
              ていなかった)。

準拠

       SVr4, POSIX.1-2001.

       SHM_HUGETLBSHM_NORESERVE は Linux での拡張である。

注意

       Linux や POSIX の全てのバージョンでは、 <sys/types.h><sys/ipc.h> のインクルードは必要ない。しかしなが
       ら、いくつかの古い実装ではこれらのヘッダーファイルのインクルードが必要であり、  SVID   でもこれらのインク
       ルードをするように記載されている。このような古いシステムへの移植性を意図したアプリケーションではこれらの
       ファイルをインクルードする必要があるかもしれない。

       IPC_PRIVATE はフラグではなく key_t 型である。 この特別な値が key に使用された場合は、 shmget() は  shmflg
       の下位 9 ビットを除いた全てを無視し、 新しい共有メモリーセグメントを作成する。

   共有メモリーの上限
       shmget()  コールに影響する共有メモリーセグメント資源の制限は以下の通りである:

       SHMALL 共有メモリーの全使用量のシステム全体での上限値。 システムページサイズが単位である。

              Linux  では、この上限値は  /proc/sys/kernel/shmall 経由で参照したり、変更したりできる。 Linux 3.16
              以降では、 この上限値のデフォルト値は以下のとおりである。

                  ULONG_MAX - 2^24

              この値は割り当てに関する上限としては適用されない (なお、この値は 32 ビットシステムにも 64 ビットシ
              ステムにも適したものになっている)。  ULONG_MAX ではなく、この値が選ばれたのは、 古いアプリケーショ
              ンが最初に現在の値を確認せずに既存の上限をそのまま増やしてしまっても問題が起こらないようなデフォル
              ト値を選んだからである。  このようなアプリケーションでは、  上限を  ULONG_MAX に設定すると値がオー
              バーフローしてしまうことになる。

              Linux 2.4 から Linux 3.15 では、この上限のデフォルト値は以下であった。

                  SHMMAX / PAGE_SIZE * (SHMMNI / 16)

              SHMMAXSHMMNI が変更されないとすると、 この式の結果に (バイト単位の値を得るために) ページサイズ
              を掛け算すると、  全ての共有メモリーセグメントで使用される全メモリーの上限として、 8 GB という値が
              得られる。

       SHMMAX 1 つの共有メモリーセグメントの最大サイズ (バイト数)。

              Linux では、この上限値は /proc/sys/kernel/shmmax 経由で参照したり、変更したりできる。  Linux  3.16
              以降では、 この上限値のデフォルト値は以下のとおりである。

                  ULONG_MAX - 2^24

              この値は割り当てに関する上限としては適用されない (なお、この値は 32 ビットシステムにも 64 ビットシ
              ステムにも適したものになっている)。 (ULONG_MAX ではなく)  このデフォルト値が使われている理由につい
              ては SHMALL の説明を参照。

              Linux 2.2 から Linux 3.15 までは、この上限値のデフォルト値は 0x2000000 (32MB) であった。

              共有メモリーセグメントの一部分だけをマッピングすることはできないので、  使用可能なセグメントの最大
              サイズには仮想メモリーの総量という別の上限が適用される。 例えば、i386 ではマッピング可能な最大セグ
              メントの大きさはおおよそ 2.8GB で、 x86_64 では上限はおおよそ 127TB である。

       SHMMIN 共有メモリーセグメントのバイト単位の大きさの下限:  実装依存 (現在は 1 バイトだが、実質的な最小サイ
              ズは PAGE_SIZE である)。

       SHMMNI システム全体の共有メモリーセグメント数の上限値。  この上限値のデフォルトは、  Linux  2.2  以降では
              128、 Linux 2.4 以降で 4096 である。

              Linux では、この上限値は /proc/sys/kernel/shmmni 経由で参照したり、変更したりできる。

       プロセス当りの共有メモリーセグメントの個数の最大値 (SHMSEG)  に関する実装上の制限はない。

   Linux での注意
       バージョン  2.3.30 までは、Linux は 削除が予定されている共有メモリーセグメントに対して shmget()  が行われ
       ると EIDRM を返していた。

バグ

       IPC_PRIVATE という名前を選んだのはおそらく失敗であろう。 IPC_NEW の方がより明確にその機能を表しているだろ
       う。

関連項目

       memfd_create(2), shmat(2), shmctl(2), shmdt(2), ftok(3), capabilities(7), shm_overview(7), svipc(7)

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告
       に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。