4 共享内存
4.1 共享内存定义
共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式,它允许两个不相关的进程访问同一个逻辑内存。共享内存是由IPC为进程创建的一个特殊的地址空间,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到它们自己的地址空间中。对共享内存访问的同步控制必须由程序员来操作。
4.2 函数shmget
得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符。
- 函数原型:
- int shmget(key_t key, size_t size, int shmflg)、
- 参数说明:
- key:
- 0(IPC_PRIVATE):会建立新共享内存对象
- 大于0的32位整数:视参数shmflg来确定操作。通常源于ftok()返回的IPC键值
- size:
- >0:新建的共享内存大小,以字节为单位
- =0:只获取共享内存时指定为0
- shmflg:
- 0:取共享内存标识符,若不存在则函数会报错
- IPC_CREAT:当shmflg&IPC_CREAT为真时,如果内核中不存在键值与key相等的共享内存,则新建一个共享内存;如果存在这样的共享内存,返回此共享内存的标识符
- IPC_CREAT|IPC_EXCL:如果内核中不存在键值与key相等的共享内存,则新建一个消息队列;如果存在这样的共享内存则报错
- int:
- 返回值>0 ,返回共享内存的标识符
- 返回值=-1,错误原因存于error中
4.3 函数shmat
把共享内存区对象映射到调用进程的地址空间
- 函数原型:
- void *shmat(int shmid, const void *shmaddr, int shmflg)
- 参数说明:
- msqid:
- 共享内存标识符
- shmaddr:
- 指定共享内存出现在进程内存地址的什么位置
- 直接指定为NULL让内核自己决定一个合适的地址位置
- shmflg:
- SHM_RDONLY:为只读模式,其他为读写模式
- void*:
- 成功:附加好的共享内存地址
- 出错:-1,错误原因存于error中
4.4 函数shmdt
与shmat函数相反,是用来断开与共享内存附加点的地址,禁止本进程访问此片共享内存
- 函数原型:
- int shmdt(const void *shmaddr)
- 参数说明:
- shmaddr:
- 连接的共享内存的起始地址
- int:返回值
- 成功:0
- 出错:-1,错误原因存于error中
4.5 函数shmctl
完成对共享内存的控制
- 函数原型:
- int shmctl(int shmid, int cmd, struct shmid_ds *buf)
- 参数说明:
- msqid:
- 共享内存标识符
- cmd:
- IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中
- IPC_SET:改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmid_ds结构内
- IPC_RMID:删除这片共享内存
- buf:
- 共享内存管理结构体。具体说明参见共享内存内核结构定义部分
- int:函数返回值
- 成功:0
- 出错:-1,错误原因存于error中