进程通信之共享内存

共享内存的原理

在这里插入图片描述

共享内存是进程通信的一种方式
共享内存的原理可以这么理解
操作系统申请了一块内存空间,并且映射在需要通信的各进程的共享区(堆栈之间),然后操作系统将映射的虚拟地址返回给用户(进程)。

使用共享内存通信的进程或许有很多,每个共享内存都通过特定的数据结构描述起来,这个数据结构包括共享内存的唯一标识key、共享内存的大小size、使用该共享内存的进程数attch等等。

共享内存是最快的IPC形式。内存映射到共享它的进程的地址空间后,这些进程不再通过执行进入内核的系统调用来进行数据传递。

相关指令

在这里插入图片描述

使用共享内存函数通信

1. ftok函数
在这里插入图片描述
一般情况下,两个参数都可以任意填写,函数的作用是返回一个唯一的key值供其他地方使用。

2. shmget函数:

功能:用来创建共享内存

原型:

 int shmget(key_t key, size_t size, int shmflg);

参数:

key:用户层生成的区分各个共享内存的标识
size:共享内存大小
shmflg:第三个参数可以填写如下

IPC_CREAT:
如果内核中不存在键值与key相等的共享内存,则新建一个共享内存;如果存在这样的共享内存,返回此共享内存的标识符

IPC_CREAT|IPC_EXCL:
如果内核中不存在键值 与key相等的共享内存,则新建一个共享内存;如果存在这样的共享内存则报错

0:
返回共享内存的标识符

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

注意这里返回的标识符不是key,而是shmid,两者都标识这块共享内存,但是创建共享内存之后,我们使用shmid来操作

3.shmat函数

功能:将共享内存段连接到进程地址空间
原型

 void *shmat(int shmid, const void *shmaddr, int shmflg);

参数
shmid: 共享内存标识
shmaddr:一般传NULL即可
shmflg:一般传0即可

返回值:成功返回一个指针,指向共享内存起始地址,失败返回-1

4.shmdt函数

功能:将共享内存段与当前进程脱离

原型

 int shmdt(const void *shmaddr);

参数

shmaddr: 由shmat所返回的指针
返回值:成功返回0;失败返回-1

注意:将共享内存段与当前进程脱离不等于删除共享内存段

5.shmctl函数

功能:用于控制共享内存

原型:

int shmctl(int shmid, int cmd, struct shmid_ds *buf)

返回值:成功返回0;失败返回-1

可用来删除共享内存,因为共享内存不是随着进程结束就自动释放,需要我们删除,使用此函数删除时,第二个参数传为IPC_RMID,第三个参数传为NULL即可。

也可以使用指令来删除

ipcs -m shmid

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

江南无故人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值