编程接口指南

附加和拆离共享内存段

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

 		}

 	}

 	...