共有メモリーセグメントの接続と切り離しを行うには、shmat() と shmdt() を使用します(shmop(2) のマニュアルページを参照)。shmat(2) は、共有セグメントの先頭へのポインタを戻します。shmdt(2) は、shmaddr で指定されたアドレスから共有メモリーセグメントを切り離します。次のコードに、shmat(2) と shmdt(2) の呼び出しの使用例を示します。
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
static struct state { /* 接続されるセグメントの内部レコード */
int shmid; /* 接続されるセグメントの ID */
char *shmaddr; /* 接続点 */
int shmflg; /* 接続時に使用されるフラグ */
} ap[MAXnap]; /* 現在接続されているセグメントの状態 */
int nap; /* 現在接続されているセグメント数 */
...
char *addr; /* アドレス用の作業変数 */
register int i; /* 作業領域*/
register struct state *p; /* 現在の状態エントリへのポインタ */
...
p = &ap[nap++];
p–>shmid = ...
p–>shmaddr = ...
p–>shmflg = ...
p–>shmaddr = shmat(p->shmid, p->shmaddr, p->shmflg);
if(p–>shmaddr == (char *)-1) {
perror("shmat failed");
nap–-;
} else
(void) fprintf(stderr, "shmop: shmat returned %p\n",
p–>shmaddr);
...
i = shmdt(addr);
if(i == –1) {
perror("shmdt failed");
} else {
(void) fprintf(stderr, "shmop: shmdt returned %d\n", i);
for (p = ap, i = nap; i–-; p++) {
if (p–>shmaddr == addr) *p = ap[–-nap];
}
}
...