システムインタフェース

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

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