shmget() - 共用メモリー・セグメントの取得
標準
| 標準/拡張機能 | C/C++ | 依存項目 |
|---|---|---|
XPG4 |
両方 |
形式
#define _XOPEN_SOURCE
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
機能説明
shmget() 関数は、key と関連した共用メモリー ID を戻します。
- 引数 key は、IPC_PRIVATE の値をとります。
- 引数 key には共用メモリー ID がまだ関連付けられておらず、フラグ IPC_CREAT が指定されています。
セグメント・レベルでの共用を要求する場合は、__IPC_MEGA を指定します。その結果、共用メモリー・セグメントは、ページ単位ではなくセグメント単位で割り振られます。共用メモリー・サイズ・パラメーターは、必要バイト数を反映していますが、メガバイトの倍数でなくてはなりません。共用メモリー・サイズ・パラメーターが、メガバイトの倍数ではない 0 または 1 といった値の場合、その要求は失敗します。
最初の shmget で共用メモリー・セグメントを定義したときに、セグメントに __IPC_MEGA 属性があるか否かが決まります。既存の共用メモリー・セグメントを使用する後続の shmget では、そのセグメントで定義された __IPC_MEGA 属性が使用されます。__IPC_MEGA オプションは、後続の shmgets には効果がなく、無視されます。
大きいセグメントに対して __IPC_MEGA オプションを指定すると、特に共用量 が増加し、実記憶を大幅な節約および ESQA の使用量の削減を行うことができます。
- __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 と関連した共用メモリー・セグメントが 既に存在している場合には、引数 shmflg に IPC_EXCL および IPC_CREAT を 設定すると、shmget() を強制的に失敗させることになります。
- フィールド shm_perm.cuid および shm_perm.uid は、呼び出しプロセスの 有効ユーザー ID と等しく設定されます。
- フィールド shm_perm.cgid および sem_perm.gid は、呼び出しプロセスの 有効グループ ID と等しく設定されます。
- shm_perm.mode の下位 9 ビットは、shmflg の 下位 9 ビットの値に設定されます。
- フィールド shm_segsz は、引数 size と同じ値 に設定されます。
- フィールド shm_lpid、shm_nattach 、shm_atime、および shm_dtime は、ゼロ と等しく設定されます。
- shm_ctime の値は、現在時間と等しく設定され ます。
使用上の注意
- Ipc_MEGA を使用して作成された共用メモリー・セグメントは、w_getipc によって戻される S_MODE バイトに IPC_MEGA ビットを示します。
AMODE 64 の特殊な動作: 割り振られた共用メモリー・セグメントが付加された先のアドレスが、2 ギガバイトより上のアドレス範囲にある場合、アプリケーションがそのアドレスを変更することはできません。 AMODE 64 ユーザーの場合、size パラメーターはメガバイトの倍数に切り上げられます。
戻り値
正常に実行された場合、shmget() は、負ではない整数、つまり共用メモリー ID を戻します。
- エラー・コード
- 説明
- EACCES
- 引数 key の共用メモリー ID が存在しますが 、shmflg の下位 9 ビットで指定されるような 操作許可は認可されませんでした。
- EEXIST
- 引数 key に共用メモリー ID が存在し 、IPC_CREAT と IPC_EXCL の両方が 、shmflg で指定されます。
- EINVAL
- 共用メモリー ID が指定済みの引数 key に存在して
おらず、引数 size の値が、システムが課す最小値より
小さいか、またはシステムが課す最大値より大きくなっています。
もしくは、引数 key の共用メモリー ID は存在しますが、それと関連したセグメントのサイズが、引数 size で指定されたものより少なくなっています。
もしくは、 __IPC_MEGA が指定されていても、セグメント・サイズを示す size_t がメガバイトの倍数で指定されていません。
- ENOENT
- 共用メモリー ID が引数 key に存在しておらず 、IPC_CREAT が指定されません。
- ENOMEM
- 共用メモリー ID および関連した共用メモリー・セグメント は作成できますが、使用可能なシステム・ストレージの容量が、要求を 満たすには不十分です。
- ENOSPC
- 共用メモリー ID は作成できますが、割り振られた 共用メモリー ID の最大数が、システム全体で、システムが課す制限を 超えています。
- 以前に key を使用して共用メモリー ID を作成しており、この shmget() の呼び出しプロセスにその読み取りまたは書き込み許可 (あるいはその両方) がある場合、shmget() は関連する共用メモリー ID を戻します。
- 以前に key を使用して共用メモリー ID を作成しており、この shmget() の呼び出しプロセスにその読み取りまたは書き込み許可 (あるいはその両方) がない場合、shmget() は -1 を戻して、errno を EACCES に設定します。
- 以前に key を使用して共用メモリー ID を作成していない場合、shmget() は -1 を戻して、errno を ENOENT に設定します。