SHMOP(2V) — NEWS-OS Programmer’s Manual
名称
shmop − 共有メモリーの操作。
形式
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
char ∗shmat (shmid, shmaddr, shmflg)
int shmid;
char ∗shmaddr
int shmflg;
int shmdt (shmaddr)
char ∗shmaddr
解説
Shmat は shmid で示される共有メモリー識別子に 対応する共有メモリーのセグメントを、 呼びだしプロセスのセグメント に取り付けます。 そのセグメントは 以下の標準の1つで指定されるアドレス で取り付けられます。
shmaddr がゼロであれば、 システムで指定される最初の有効アドレス に取り付けられます
shmaddr がゼロでなく、 (shmflg & SHM_RND) が真であれば、 (shmaddr - (shmaddr modulus SHMLBA)) で指定されるアドレスに取り付けられます。
shmaddr がゼロでなく、 (shmflg & SHM_RND) が偽であれば、 shmaddr で指定されるアドレスで 取り付けられます。
(shmflg & SHM_RDONLY) が真 {READ} であればセグメントが 読み出し専用で取り付けられ、 そうでなければ、 読み出しと書き込み 可能として 取り付けられます。
以下の内容の1つでも該当すれば、 Shmat は失敗し、 共有メモリーのセグメントは 取り付けられません。
[EINVAL] Shmid は有効な共有メモリー識別子でない。
[EACCES] 操作許可が呼びだしプロセス に対して認められない ( intro(2) 参照)。
[ENOMEM] 有効なデータ領域が共有メモリー のセグメントを取り付けるのには不足 している。
[EINVAL] Shmaddr がゼロでなく、 (shmaddr - (shmaddr modulus SHMLBA)) の値が不正なアドレスである。
[EINVAL] Shmaddr がゼロでなく、 (shmflg & SHM_RND) が偽で、 shmaddr の値が不正なアドレス。
[EMFILE] 呼びだしプロセスに取り付けられた共有 メモリーのセグメントの数が システムの限界を超えている。
[EINVAL] Shmdtは呼び出しプロセスのデータセグメントから shmaddr で指定された共有メモリのセグメントを 取除きます。 shmaddr が共有メモリーのセグメント のデータ・セグメントの開始アドレス ではない場合、 Shmdt は失敗し、 共有メモリーのセグメントは 取り除かれない。
リターン値
コマンドの実行が成功すると、 リターン値は以下のようになります。
Shmat は取り付けられた共有メモリー のセグメントの データ・セグメントの開始アドレスを 返します。
Shmdt はゼロを返します。
失敗した場合、 −1が返され、 errno が設定されます。
関連事項
exec(2), exit(2), fork(2), intro(2), shmctl(2V), shmget(2V).
NEWS-OSRelease 4.1C