共有メモリーセグメントの接続と切り離しを行うには、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 { /* Internal record of attached segments. */ int shmid; /* shmid of attached segment */ char *shmaddr; /* attach point */ int shmflg; /* flags used on attach */ } ap[MAXnap]; /* State of current attached segments. */ int nap; /* Number of currently attached segments. */ ... char *addr; /* address work variable */ register int i; /* work area */ register struct state *p; /* ptr to current state entry */ ... 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]; } } ...