【Linux】:system V共享内存

朋友们、伙计们,我们又见面了,本期来给大家带来system V共享内存相关代码和知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

C + + 专 栏   :C++

Linux 专 栏  :Linux

​ 

目录

1. system V共享内存 

1.1 共享内存的原理

2. 共享内存系统接口

① 创建共享内存

② 挂接共享内存 

③ 断开共享内存 

④ 控制共享内存 

2.1 共享内存数据结构 

3. 示例代码 

4. 共享内存特点 

4.1 共享内存代码改进 


1. system V共享内存 

共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。

1.1 共享内存的原理

  • 首先有两个互不相干的进程需要进行通信,此时OS会在内存空间中开辟一块空间,将这块空间先通过第一个进程的页表映射到自己进程地址空间的共享区中,此时第一个进程就能拿到这块空间的起始地址;
  • 同样的第二个进程也将这块内存空间通过页表映射到自己进程地址空间的共享区,第二个进程也可以拿到同样的起始地址;
  • 此时这两个进程就通过同样的起始地址看到了由OS提供的同一份资源,这就形成了进程间通信的前提,此时若要通信直接向该内存中写入或者读取数据即可,这块内存空间就叫做共享内存;
  • OS中不止存在一个共享内存,所以众多的共享内存需要被OS管理,先描述,再组织(struct shm) 。
  • 一个共享内存不仅仅被两个进程映射,可能存在多个进程,那么如何保证第二个之后参与通信的进程看到的就是同一个共享内存呢?所以每个共享内存就要有唯一的标识。

2. 共享内存系统接口

① 创建共享内存

  • shmget接口:

  • 参数: 

key:唯一标识键值key

可以通过ftok函数专门生成:


size:共享内存大小

共享内存的大小强烈建议设置为4096的整数倍;
shmflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的

IPC_CREAT:shm不存在就创建,存在就回去并返回;

IPC_EXCL:不单独使用,配合IPC_CREAT | IPC_EXCL使用,表示shm不存在就创建,存在就出错返回,保证了创建的共享内存都是全新的。

IPC_CREAT | IPC_EXCL | 0664:表示创建出的共享内存的权限是0664。       

  • 返回值:

成功返回一个非负整数,即该共享内存段的标识码;失败返回-1

  • 在命令行输入ipcs -m:查看创建的共享内存。 
  • 在命令行输入ipcrm -m shmid:删除指定的共享内存。
  • 共享内存生命周期随内核,进程退出依旧存在。

② 挂接共享内存 

  • shmat接口:

  • 参数:

shmid:共享内存标识
shmaddr:指定连接的地址(设置为nullptr)
shmflg:它的两个可能取值是SHM_RND和SHM_RDONL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

stackY、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值