Linux _ share 内存共享
共享内存
1 什么是共享内存
使得两个不同的进程共享一段逻辑内存,实际上都实现为共享同一段物理内存。
原理如下图:
2 共享内存的使用
2.1共享内存的获取
原型:int shmget (key_t key, size_t size, int shmflg);
参数:1)key 共享内存的键值
特殊键值:IPC_PRIVATE,该共享内存该创建进程所独享
仅能用于父子进程间的通信。
2)size 共享内存的大小,单位为字节
3)标志,和open的mode类似
特殊标志:IPC_CREAT 创建共享内存,
多次“创建”不是错误
返回值:
成功: 返回一个非负整数,作为共享内存的标识符。
失败:返回-1
2.2. 共享内存和逻辑地址间的关联
原型:
void *shmat(int shmid, const void *shmaddr, int shmflg);
参数1:即为shmget的返回值。
参数2:指定关联到该进程的什么位置
一般取0,让系统自动选择。
参数3:如果使用SHM_RDONLY 则该段共享内存是只读的,即使访问权限允许写操作
一般取0
返回:返回一个本进程空间内的虚拟指针,该指针关联到共享内存。
2.3 共享内核和逻辑地址间的分离
原型:
int shmdt(const void *shmaddr);
参数:即为shmat的返回值
注意:仅分离,并不删除该共享内存。
返回值:成功,返回0
失败,返回-1
2.4 共享内存的控制
原型:
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数:
cmd: IPC_STAT 获取当前状态,返回给参数3
IPC_SET 设置共享内存(如果权限允许)
IPC_RMID 删除该段共享内存
2.5 实例
mainr.c
mainw.c