共享内存
-
通信原理:
开辟一块内存空间,各个进程将同一块物理内存空间映射到自己的虚拟地址空间中,通过虚拟地址进行访问,进而实现数据共享
特性:共享内存是最快的进程间通信方式,直接通过虚拟地址访问物理内存,相比较于其他方式少了两次数据拷贝
- 操作流程
1,创建或打开共享内存
int shmget(key_t key,size_t size,int shmflg)
key:标识符 通过相同标识符,多个进程可以打开同一块共享内存
size:要创建的共享内存大小
shmflg:打开方式+权限: IPC_CREAT|IPC_EXCL|0664
返回值:成功:操作句柄 失败-1
2,与进程建立映射关系
void *shmat(int shmid,const void* shmaddr,int shmflg)
shimid:shmget返回的操作句柄
shmaddr:映射首地址,通常置为NULL
shmflg: SHM_RDONLY--只读 0--可读可写
返回值:成功返回映射后的首地址 失败返回(void*)-1;
3,对共享内存进行内存操作
memcp strcpy等等
4,与进程间解除映射关系
int shmdt(void* shmaddr)
返回值:成功返回0 失败-1
5,删除共享内存
int shmctl(int shmid,int cmd,stuct shmid_ds *buf)
shmid:shmget返回的操作句柄
cmd:要对共享内存进行操作的类型 IPC_RMID--标记要删除的共享内存 映射链接数为0时删除共享内存,禁止新的映射连接
buf:用于获取或设置共享内存属性的
返回值:成功返回0 失败-1
代码示例如下:
测试结果如下:
运行shmread 从共享内存中读取数据 如果共享内存中存在之前写入数据 将会一直打印之前写入的信息,且不会更新
运行shmwrite后,共享内存中的数据开始更新
此时注意到,如果一直write向共享内存中写入数据,即使关闭read 更新内存中的数据在后台依然会一直更新
-
综上总结:
通信原理:开辟一块物理内存,多个进程将同一块内存映射到自己的虚拟地址空间进行访问,进而实现数据共享
特性:
1,效率最高的进程间通信方式
2,生命周期随内核
注意:各个进程对共享内存的操作都是不安全的操作