shmat() - 共用メモリー付加操作

標準

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

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

両方  

形式

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

void  *shmat(int shmid, const void *shmaddr, int shmflg);

機能説明

shmat() 関数は、共用メモリー ID、shmid と 関連した共用メモリー・セグメントを、呼び出しプロセスの アドレス・スペースに付加します。セグメントは、次の基準の 1 つ によって指定されるアドレスに付加されます。
  • shmaddr が NULL ポインターの場合には、セグメント は、システムで選択された使用可能な最初のアドレスに付加され ます。
  • shmaddr が NULL ポインターではなく、フラグ SHM_RND が指定された場合は、セグメントは、% が 'C' 言語の剰余演算子である (shmaddr-((prtdiff_t)shmaddr%SHMLBA)) が指定するアドレスに付加されます。
  • shmaddr が NULL ポインターではなく、フラグ SHM_RND が指定されなかった場合、セグメントは、shmaddr が指定するアドレスに付加されます。
  • フラグ SHM_RDONLYshmflg で指定され、呼び出しプロセスが許可を読み取っていた場合には、セグメントが読み取りのために付加されます。フラグが設定されず、プロセスに 読み取りと書き込みの両方の許可がある場合には、セグメントが読み取りおよび書き込みのために付加されます。

    SHM_RDONLY オプションに関係なく、新しく作成された __IPC_MEGA セグメントの最初の付加には、セグメントへの書き込みアクセスがあります。また、後続の付加にも同様に書き込みアクセスがあります。

  • __IPC_MEGA 共用メモリー・セグメントへのすべての付加には、同じ書き込みまたは読み取りアクセス権限があります。セグメントが書き込み可能であれば、すべての付加には、そのセグメントへの読み取りおよび書き込み権限があります。セグメントが書き込み不可の場合、すべての付加にはセグメントの読み取り権限はありますが、セグメントへの書き込み権限はありません。

    SHM_RDONLY オプションに関係なく、新しく作成された __IPC_MEGA セグメントの最初の付加には、セグメントへの書き込みアクセスがあります。また、後続の付加にも同様に書き込みアクセスがあります。書き込み/読み取りアクセスは、共用メモリー制御操作である shmctl() 関数で変更することができます。

__IPC_MEGA 共用メモリー・セグメントは、次のように付加されます。
  • shmaddr がゼロであり、さらに __IPC_MEGA セグメントである場合、そのセグメントは、セグメント境界上のシステムが選択した最初の使用可能アドレスで付加されます。
  • shmaddr がゼロではなく、SHM_RND が指定されており、なおかつ __IPC_MEGA セグメントである場合、セグメント・アドレスはセグメント 境界 (最後の 20 ビット・ゼロ) に切り捨てられます。
  • shmaddr がゼロではなく、SHM_RND が指定されていなくても、__IPC_MEGA セグメントである場合、セグメント・アドレスはメガバイトの倍数 (セグメント境界) でなくてはなりません。

戻り値

正常に実行された場合には、付加共用メモリー・セグメントの共用メモリー ID と関連したデータ構造 の shm_nattach の値が、shmat() によって増分 され、セグメントの開始アドレスが戻されます。

正常に実行されなかった場合、shmat() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EACCES
呼び出しプロセスへの操作許可は拒否されます。
EINVAL
shmid の値が無効共用メモリー ID です。shmaddr は NULL ポインターではなく 、(shmaddr-((ptrdiff_t)shmaddr%SHMLBA)) の 値が、共用メモリー・セグメントの付加については無許可のアドレス です。あるいは、shmaddr が NULL ポインターではなく 、SHM_RND が指定されており、shmaddr の値 が共用メモリー・セグメントの付加については無許可のアドレス です。

共用メモリー・アドレス *shmaddr がゼロではなく、メガバイト境界上 に存在しておらず、なおかつ SHM_RND が指定されませんでした。

EMFILE
呼び出しプロセスに付加された共用メモリー・セグメント数が、システムが課す制限を超えた場合があります。
ENOMEM
使用可能データ・スペースの大きさが不十分で、共用メモリー・セグメントを収容できません。

関連情報