1 shmget函数
#include <sys/shm.h>
int shmget(key_t key, size_t size, int oflag)
返回一个共享区标识符
Key既可以是ftok返回值,也可以是IPC_PRIVATE
Size以字节为单位指定内存区大小
2 shmat函数
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int flag)
连接共享内存标识符为shmid的共享内存,连接成功后把共享内存区对象映射到调用进程的地址空间,随后可像本地空间一样访问
如果shmaddr是一个空指针,那么系统调用者选择地址
如果shmaddr是一个非空指针,那么返回地址取决于调用者是否给flag指定SHD_RND:
如果SHD_RND没有指定,那么相应的共享内存区附接到由shmaddr参数指定的地址
如果SHD_RND指定了,那么相应的共享内存区附接到shmaddr参数指定的地址向下舍入一个SHMLBA常值(LBA:低端边界地址)
3 shmdt函数
#include <sys/shm.h>
int shmdt(const void *shmaddr);
断开共享内存连接
4 shmctl函数(完成对共享内存的控制)
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
cmd有如下取值:
IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中
IPC_SET:改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmid_ds结构内
IPC_RMID:删除这片共享内存
5 共享内存区的限制
6 小结
System V共享内存区最新常用的函数调用是:
shmget获取一个标识符
shmat把一个共享内存区附接到调用进程的地址空间
以一个IPC_STAT命令调用shmctl:获取一个已存在共享内存区的大小
以一个IPC_RMID命令调用shmctl:删除一个共享内存区对象
后记
APUE,UNPv1,UNPv2已经看完了,一些基本的操作还是能看懂的。由于UNP两本书上的有些代码在APUE中已经贴出来了,所以就没有再次粘贴,所以UNP两本书的学习笔记只有一些概念性的介绍,没有代码。有兴趣可以自己买本书或者下载pdf自行查阅