大家好,我是菲英。
在前面呢,我们了解了进程间通信模块的管道机制和消息队列机制:
本期,我们就继续来了解进程间通信模块的共享内存机制。
首先,为什么它是最快的进程间通信机制?
因为,它是多个进程的一块虚拟内存映射到同一块物理内存区域来实现数据共享,而无需使用内核来中转数据。
然后,我们来看看它的优缺点
所以它到底是怎么使用的呢?
首先,我们一般先通过系统提供的接口获取一个 key
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
第一个参数 pathname:文件路径,用于生成 key
第二个参数 proj_id:一个整数,也是用于生成 key
返回值:成功返回 key,失败返回 -1
然后,我们需要创建一个共享内存
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
第一个参数 key 是一个唯一标识:一般用第一个函数生成的 key
第二个参数 size:共享内存的大小,一般设置为内存页大小的整数倍,也就是 4KB 的整数倍
第三个参数 shmflg:如何创建共享内存,它有一下几种入参:
IPC_CREAT // 如果不存在,则创建;如果存在,则返回旧的共享内存标识符。
IPC_EXCL // 如果存在则返回错误,即创建一个全新的共享内存。
0666 // 权限位:用于设置创建的共享内存的权限,通常以经典八进制表示。
例子:
int shmid = shmget(key, 409600, IPC_CREAT | IPC_EXCL | 0666);
返回值:成功返回该块内存的标识,失败还是返回 -1
想使用这块内存的话,我们还需要连接它
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
第一个参数 shmid:由上一个函数 shmget 返回的共享内存标识符。
第二个参数 shmaddr:指定连接的地址,一般为 NULL,表示由系统自动选择一个地址。
第三个参数 shmflg:设置对共享内存的读写权限,通常为 0 表示读写权限。
返回值:成功时返回连接的共享内存地址,失败时返回 -1(void* 类型)。
那如何断开它呢?
#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr);
入参 shmaddr 显然就是要断开的共享内存地址了。
返回值:成功为 0,失败为 -1
用完了得删除它吧,那怎么删除它呢?
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
第一个参数 shmid:还是由 shmget 返回的共享内存标识符。
第二个参数 cmd 参数:控制命令,有以下几种取值
IPC_STAT // 获取共享内存的状态信息。
IPC_SET // 设置共享内存的状态信息。
IPC_RMID // 删除共享内存。
第三个参数 buf:一个保存着共享内存的信息(模式状态和访问权限)的数据结构 struct shmid_ds。
通常设置为 nullptr。
返回值:成功为 0,失败为 -1
那它的原理是什么呢?
其实它的原理非常简单:它就是把同一块物理内存映射到了不同进程的虚拟内存空间里面。
作者简介
从材料专业一路转行,深知计算机基础的重要性,所以经常分享这些知识,期待你的关注、和我一起学习。
也给大家整理了免费的计算机求职学习资料,下方CSDN卡片关注后私信“求职”、“考证”获取下载方式。
标签:共享内存,操作系统,int,参数,key,shmid,讲明,include From: https://blog.csdn.net/H_P10/article/details/144117045