プログラミングインタフェース

共有メモリーセグメントの接続と切り離し

共有メモリーセグメントの接続と切り離しを行うには、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];
 		}
 	}
 	...