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]; } } ... |