IPC_STAT 是控制命令, 是控制命令 可取值如下: 得到共享内存的状态, 得到共享内存的状态,IPC_SET 改变共享内存的状态 IPC_RMID 删除共享内存。 删除共享内存。 struct shmid_ds *buf是一个结构体指针。 是一个结构体指针。 是一个结构体指针 IPC_STAT的时候,取得的状态放在这个结构体中。 的时候, 的时候 取得的状态放在这个结构体中。 如果要改变共享内存的状态,用这个结构体指定。 如果要改变共享内存的状态,用这个结构体指定。 返回值:成功时返回0。失败时返回-1。 返回值:成功时返回 。失败时返回 。 shmget()的使用 shmget()的使用 The following code illustrates shmget(): shmget(): #include #include #include ... key_t key; /* key to be passed to shmget() */ shmget() int shmflg; /* shmflg to be passed to shmget() */ shmflg; shmget() int shmid; /* return value from shmget() */ shmid; shmget() int size; /* size to be passed to shmget() */ shmget() ... key = ... size = ... shmflg = ... ... if ((shmid = shmget (key, size, shmflg)) == -1) ((shmid shmflg)) { perror("shmget: shmget failed"); exit(1); } perror("shmget: else {(void) fprintf(stderr, "shmget: shmget returned %d\n", shmid); fprintf(stderr, "shmget: %d\ shmid); exit(0); } ... shmctl()的使用 The following code illustrates shmctl(): shmctl(): #include #include #include ... int cmd; /* command code for shmctl() */ int shmid; /* segment ID */ struct shmid_ds shmid_ds; /* shared memory data structure to hold results */ ... shmid = ... cmd = ... if ((rtrn = shmctl(shmid, cmd, shmid_ds)) == -1) { perror("shmctl: shmctl failed"); exit(1); } ... shmat() and shmdt()的使用 #include #include #include 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); shmat(pppif(pif(p->shmaddr == (char *)-1) *){ perror("shmop: shmat failed"); nap--; } nap--; else (void) fprintf(stderr, "shmop: shmat returned %#8.8x\n", p->shmaddr); %#8.8x\ p... i = shmdt(addr); shmdt(addr); if(i == -1) { perror("shmop: shmdt failed"); } else { (void) fprintf(stderr, "shmop: shmdt returned %d\n", i); %d\ for (p = ap, i = nap; i--; p++) i--; if (p->shmaddr == addr) *p = ap[--nap]; } (pap[--nap]; ... Shared Memory Example /*write.c*/ #include #include #include #include #include #define SHMSZ main() { char c; int shmid; key_t key; char *shm, *s; key = 5679; if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) { shmget(key, perror("shmget"); exit(1); } if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) { shmat(shmid, perror("shmat"); exit(1); } if ((shmid = shmget(key, SHMSZ, 0666)) < 0) { shmget(key, perror("shmget"); exit(1); } if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) { shmat(shmid, perror("shmat"); exit(1); } for (s = shm; *s != NULL; s++) putchar(*s); putchar('\ putchar('\n'); *shm = '*'; exit(0); } while (*shm != '*') sleep(1); exit(0); } 27 /*read.c*/ #include #include #include #include #include #define SHMSZ main() { int shmid; key_t key; char *shm, *s; key = 5679; 27 s = shm; for (c = 'a'; c <= 'z'; c++) *s++ = c; *s = NULL; 运行上页的例题,体会两个进程通过share memory实现数据的共享。 改写上述代码,实现 A进程往share memory写入一串小写字符,然后挂起 等候; B进程访问share memory,读出小写字符,并将字符 改成大写字符重新写入share memory;终止运行。 A进程读出大写字符,终止运行。 例子2:生产者-消费者 调试运行(pc.c)