SHMOP(2V) — NEWS-OS Programmer’s Manual
名称
shmat, shmdt − 共有メモリの操作
形式
#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.2.1R