Linux进程间通信——SystemV共享内存

System V共享内存

System V是一种进程间通信的标准,在这种标准之下,本地通信的方式一般由三种,内存共享、消息队列、信号量

这里我们主要介绍共享内存

创建内存共享

请添加图片描述

这是内存共享的系统调用

第一个参数是共享内存在内核中的标识,类似于文件标识符的地位

第二个参数是创建共享内存的大小

第三个参数有两个选项IPC_CREAT和IPC_EXCL

如果只有第一个,则使用共享内存,不存在则创建后继续使用

第二个不能单独使用,两个相或之后表示创建共享内存后使用,存在则出错返回

第三种方法主要是为了确保所使用的共享一定是新鲜的

创建成功会返回共享内存的标识符,失败返回-1,错误码表示错误原因

共享内存存在内存的共享区中,可以有很多个,是被操作系统描述组织管理的

对于第一个参数,key是需要确定唯一的,类似于手机号,你自己有,别人不能再有一模一样的,并且别人想要打给你也必须输入一模一样的

我们可以使用ftok函数进行生成,只要两个参数相同,则能生成相同的key,类似于哈希函数

请添加图片描述

需要注意的是,共享内存在进程退出时是不会主动释放的,需要用户手动释放,除非系统内核关闭

释放共享内存

命令行
ipcs

使用这个命令可以查看当前资源,三种资源全包含

ipcs -m

查看共享内存

ipcrm -m shmid

删除对应shmid的共享内存
请添加图片描述

shmctl

这个函数主要是用于控制共享内存,有设置获取删除三种功能

请添加图片描述

shmid是共享内存id,cmd表示操作,buf是用来获取共享内存的属性的,各种属性都存在该结构体里

获取用IPC_STAT,设置用IPC_SET,删除用IPC_RMID

shmat

at是attach是关联的意思,因为共享的物理内存是属于操作系统的,我们需要将共享的内存挂载到进程地址空间的共享区,就要用到shamat

请添加图片描述

第一个参数表示要将哪个共享内存挂载

第二个参数表示要挂在到哪个地址,可以使用nullptr自动

第三个参数表示挂载的形式,都还是写,一般默认为0,保证读写

挂载成功后会返回地址,失败返回-1

挂接后我们就可以直接访问这个共享内存了

shmdt

dt是detach,分离的意思,也就是将共享内存删除,也可以说成去关联

请添加图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

栖林_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值