shmget() - 共用メモリー・セグメントの取得

標準

標準/拡張機能 C/C++ 依存項目

XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _XOPEN_SOURCE
#include <sys/shm.h>

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

機能説明

shmget() 関数は、key と関連した共用メモリー ID を戻します。

少なくとも size バイトの共用メモリー ID、関連データ構造および共用メモリー・セグメント (<sys/shm.h> を 参照) は、次のうちの 1 つが当てはまる場合には、key に 作成されます。
  1. 引数 key は、IPC_PRIVATE の値をとります。
  2. 引数 key には共用メモリー ID がまだ関連付けられておらず、フラグ IPC_CREAT が指定されています。

セグメント・レベルでの共用を要求する場合は、__IPC_MEGA を指定します。その結果、共用メモリー・セグメントは、ページ単位ではなくセグメント単位で割り振られます。共用メモリー・サイズ・パラメーターは、必要バイト数を反映していますが、メガバイトの倍数でなくてはなりません。共用メモリー・サイズ・パラメーターが、メガバイトの倍数ではない 0 または 1 といった値の場合、その要求は失敗します。

最初の shmget で共用メモリー・セグメントを定義したときに、セグメントに __IPC_MEGA 属性があるか否かが決まります。既存の共用メモリー・セグメントを使用する後続の shmget では、そのセグメントで定義された __IPC_MEGA 属性が使用されます。__IPC_MEGA オプションは、後続の shmgets には効果がなく、無視されます。

大きいセグメントに対して __IPC_MEGA オプションを指定すると、特に共用量 が増加し、実記憶を大幅な節約および ESQA の使用量の削減を行うことができます。

引数 shmflg の有効値には、<sys/ipc.h> と <sys/modes.h> で定義されている、以下の定数の組み合わせが設定されます。
__IPC_SHAREAS
このフラグによって、同じアドレス・スペースの複数プロセスから、同じストレージ域の共用部分が使用可能になります。 AMODE 31 アプリケーションに指定された場合、このフラグが有効になるのは __IPC_MEGA も指定されているときのみです。そうでない場合このフラグは無視されます。 AMODE 64 アプリケーションに指定された場合、このフラグは、2 GB 境界より上で獲得した共用メモリー・セグメントのどのタイプに対しても、有効になります。
__IPC_BELOWBAR
メモリー・オブジェクトを、2 ギガバイト・アドレス範囲より下から割り振 ることを強制します。 これを使うと、AMODE 64 アプリケーションが非 AMODE 64 アプリケーションとオブ ジェクトを共用できるようになります。 このオプションは、__IPC_GIGA オプションと相互に排他的です。 31 ビット・アプリケーションがこのオプションを指定した場合、要求は EINVAL を出して失敗します。
IPC_CREAT
指定済み key に、もう関連した ID がない 場合には、共用メモリー・セグメントを作成します。IPC_CREAT は 、IPC_PRIVATE が指定されるときには無視されます。
IPC_EXCL
指定された key に関連 ID がある場合、shmget() 関数を失敗させます。IPC_EXCL は、IPC_CREAT が指定されていない場合、または IPC_PRIVATE が指定されている場合は無視されます。
__IPC_GIGA
ギガバイトの倍数でサイズを指定して、共用メモリー・セグメントを要求 します。 このオプションを使用するには、サイズ・パラメーターがギガバイトの倍数である 必要があります。 ギガバイトの倍数を使用しないと、失敗します。 [EINVAL] このオプションは、__IPC_BELOWBAR およ び __IPC_MEGA オプションと相互に排他的です。
__IPC_MEGA
メガバイト倍数のサイズを指定して、共用メモリー・セグメント を要求します。このオプションを使用するには、サイズ・パラメーター size_t がメガバイトの倍数である必要があります。共用メモリー・ セグメントの作成には __IPC_MEGA オプションが必要ですが、__IPC_MEGA 属性をとる定義済 み/作成済みの共用メモリー・セグメントへのアクセスを取得するため に __IPC_MEGA 属性は必要ありません。 AMODE 64 アプリケーションによって指定されたとき、 オプション __IPC_BELOWBAR が指定されたものと暗黙的に解釈され、メモリー共用が有効に なります。 このオプションは、__IPC_GIGA オプションと相互に排他的です。
S_IRGRP
呼び出し元の有効グループ ID が、shm_perm.cgid または shm_perm.gid のどちらかと一致する ときに、読み取りアクセスを許可します。
S_IROTH
その他の読み取りアクセスを許可します。
S_IRUSR
呼び出し元の有効ユーザー ID が、shm_perm.cuid または shm_perm.uid のどちらかと一致する ときに、読み取りアクセスを許可します。
S_IWGRP
呼び出し元の有効グループ ID が、shm_perm.cgid または shm_perm.gid のどちらかと一致する ときに、書き込みアクセスを許可します。
S_IWOTH
その他の書き込みアクセスを許可します。
S_IWUSR
呼び出し元の有効ユーザー ID が、shm_perm.cuid または shm_perm.uid のどちらかと一致する ときに、書き込みアクセスを許可します。

引数 key と関連した共用メモリー・セグメントが 既に存在している場合には、引数 shmflgIPC_EXCL および IPC_CREAT を 設定すると、shmget() を強制的に失敗させることになります。

shmid_ds データ構造の作成時に、次のフィールド が初期設定されます。
  • フィールド shm_perm.cuid および shm_perm.uid は、呼び出しプロセスの 有効ユーザー ID と等しく設定されます。
  • フィールド shm_perm.cgid および sem_perm.gid は、呼び出しプロセスの 有効グループ ID と等しく設定されます。
  • shm_perm.mode の下位 9 ビットは、shmflg の 下位 9 ビットの値に設定されます。
  • フィールド shm_segsz は、引数 size と同じ値 に設定されます。
  • フィールド shm_lpidshm_nattachshm_atime、および shm_dtime は、ゼロ と等しく設定されます。
  • shm_ctime の値は、現在時間と等しく設定され ます。

使用上の注意

  • Ipc_MEGA を使用して作成された共用メモリー・セグメントは、w_getipc によって戻される S_MODE バイトに IPC_MEGA ビットを示します。

AMODE 64 の特殊な動作: 割り振られた共用メモリー・セグメントが付加された先のアドレスが、2 ギガバイトより上のアドレス範囲にある場合、アプリケーションがそのアドレスを変更することはできません。 AMODE 64 ユーザーの場合、size パラメーターはメガバイトの倍数に切り上げられます。

戻り値

正常に実行された場合、shmget() は、負ではない整数、つまり共用メモリー ID を戻します。

正常に実行されなかった場合、shmget() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EACCES
引数 key の共用メモリー ID が存在しますが 、shmflg の下位 9 ビットで指定されるような 操作許可は認可されませんでした。
EEXIST
引数 key に共用メモリー ID が存在し 、IPC_CREATIPC_EXCL の両方が 、shmflg で指定されます。
EINVAL
共用メモリー ID が指定済みの引数 key に存在して おらず、引数 size の値が、システムが課す最小値より 小さいか、またはシステムが課す最大値より大きくなっています。

もしくは、引数 key の共用メモリー ID は存在しますが、それと関連したセグメントのサイズが、引数 size で指定されたものより少なくなっています。

もしくは、 __IPC_MEGA が指定されていても、セグメント・サイズを示す size_t がメガバイトの倍数で指定されていません。

ENOENT
共用メモリー ID が引数 key に存在しておらず 、IPC_CREAT が指定されません。
ENOMEM
共用メモリー ID および関連した共用メモリー・セグメント は作成できますが、使用可能なシステム・ストレージの容量が、要求を 満たすには不十分です。
ENOSPC
共用メモリー ID は作成できますが、割り振られた 共用メモリー ID の最大数が、システム全体で、システムが課す制限を 超えています。
shmflg が 0 と等しいときには、以下が適用され ます。
  • 以前に key を使用して共用メモリー ID を作成しており、この shmget() の呼び出しプロセスにその読み取りまたは書き込み許可 (あるいはその両方) がある場合、shmget() は関連する共用メモリー ID を戻します。
  • 以前に key を使用して共用メモリー ID を作成しており、この shmget() の呼び出しプロセスにその読み取りまたは書き込み許可 (あるいはその両方) がない場合、shmget() は -1 を戻して、errno を EACCES に設定します。
  • 以前に key を使用して共用メモリー ID を作成していない場合、shmget() は -1 を戻して、errno を ENOENT に設定します。