共享内存
开辟一块儿物理内存空间,各个进程将这块物理内存通过页表映射到自己的虚拟内存空间中,通过访问虚拟地址,实现对物理内存的控制,进而实现数据共享。是进程间通信中最快的一种方式。
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.与进程间接触映射关系:int shmdt(const void *shmaddr);
- shmaddr:shmat返回的映射的首地址。
- 返回值:成功返回0,失败返回-1。
4.删除共享内存:int shmctl(int shmid, int cmd, struct shmid_ds *buf);
- shmid:shmget返回的操作句柄。
- cmd:要对共享内存进行的操作
IPC_RMID:标记要删除的共享内存,并不会立即删除。
当映射连接数为0时,才会删除共享内存。
当一个共享内存被标记了之后,就会禁止与新的进程创建映射连接。 - buf:用于获取或设置共享内存的属性,简单使用置NULL即可。
- 返回值:成功返回0,失败返回-1。
删除共享内存的时候,并不会立即删除,读和写的操作依然可以进行。
只是标识符发生了变化,表示不能进行新的映射连接,等到映射连接数变为0的时候,这块儿共享内存就会被删除。
总结共享内存的特性
通信原理:开辟一块儿物理内存,多个进程将同一块儿物理内存映射到自己的虚拟地址空间中,进行访问,进而实现数据通信。
- 是效率最高的进程间通信。
- 生命周期随内核。
注意事项:各个进程对于共享内存的操作,都是不安全的操作。