【Linux】共享内存

共享内存是Linux中最快的进程间通信(IPC)方式,它允许进程直接读写同一块内存空间。创建共享内存涉及在物理内存中分配空间,创建内核数据结构,挂载到地址空间,以及在使用完毕后解除映射和释放内存。主要函数包括shmget()用于创建,shmat()用于映射,shmdt()用于解除映射,以及shmctl()用于控制。通过共享内存,可以在shm_server.cpp和shm_client.cpp之间实现通信,其中server负责读取,client负责写入。
摘要由CSDN通过智能技术生成

1.共享内存的概念

共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。通信的前提是让两个进程看到同一份资源,信息的交流是建立在这个同一份资源上的,共享内存这种通信方式提供的资源或者平台是物理内存中的一块空间。首先在物理内存中申请一块空间,然后通过页表将这块空间映射到两个需要通信进程的进程地址空间,这样两个进程就可以对这块空间进行数据的写入和读取。

2.共享内存的创建

1.首先在物理地址中开辟好共享内存空间,供进程间通信使用。而且我们知道物理地址中的共享内存可能会有很多个,那么linux就要管理这些内存,管理的方法是先描述再组织,所以除了创建共享内存之外,还要为共享内存创建共享内存的内核数据结构。

2.将共享内存挂接到地址空间,本质上就是给两个进程之间的共享内存和虚拟地址空间之间建立映射,之后就可以开始进程间的数据传输与修改了。

3.用完之后要去掉共享内存和进程地址空间之间的联系,本质上就是修改页表,取消共享内存和虚拟内存的映射关系。

4.释放共享内存,将内存归还给系统。

3.函数接口

创建共享内存函数shmget()

key_t key是用来标识共享内存的,可以保证共享内存本身的唯一性
size_t size 表明需要申请空间的大小,单位是字节
int shmflg 是标志位,有两个参数IPC_CREAT 和IPC_EXCL这里的IPC_CREAT表示如果当前路径下不存在共享内存就创建一个新的共享内存,如果存在共享内存就直接使用该共享内存。后面的IPC_EXCL一般都和IPC_CREAT一起使用,两个标志位一起使用的时候就表示如果该路径下不存在共享内存就创建新的共享内存,如果存在共享内存就会报错,这样就可以保证我们永远使用的都是新创建的共享内存,这样就可以避免使用其他进程创建的共享内存而导致错误。

生成key的函数接口:

pathname路径名
proj_id 项目
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bite-ccc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值