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