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

1.概念

共享内存(Shared Memory)就是允许多个进程访问同一个内存空间,是在多个进程之间共享和传递数据最高效的方式。操作系统将不同进程之间共享内存安排为同一段物理内存,进程可以将共享内存连接到它们自己的地址空间中,如果某个进程修改了共享内存中的数据,其它的进程读到的数据也将会改变。

特点:
1.共享内存创建之后,一直存在于内核中,直到被删除或系统关闭
2.共享内存和管道不一样,读取后,内容仍然在共享内存中
 

2.shmget函数

1.int shmget(key_t key, size_t size, int shmflg);
//用来获取或创建共享内存
参数:
key:IPC_PRIVATE 或 ftok的返回值
size:共享内存区大小
shmflg:同open函数的权限位,也可以用8进制表示法
返回值:
成功:共享内存段标识符‐‐‐ID‐‐‐文件描述符
出错:‐1

IPC_PRIVATE与ftok的区别:

IPC_PRIVATE为了保证亲缘通信key值都是0,ftok的key值就不会是0

可以看到key值就不是0

下面用IPC_PRIVATE写代码

可以看到创建了一个55的共享内存,要删除共享内存可以用指令ipcrm -m  55,这个指令就是删除55的共享内存

3.shmat函数

2.void *shmat(int shm_id, const void *shm_addr, int shmflg);
//把共享内存连接映射到当前进程的地址空间
参数:
shm_id:ID号
shm_addr:映射到的地址,NULL为系统自动完成的映射
shmflg:
SHM_RDONLY共享内存只读
默认是0,表示共享内存可读写
返回值:
成功:映射后的地址
失败:NULL

这个函数的作用是把共享内存连接映射到当前进程的地址空间,这样子就不需要调用系统函数。

4.shmdt函数

3.int shmdt(const void *shmaddr);
//将进程里的地址映射删除
参数:
shmid:要操作的共享内存标识符
返回值:
成功:0
出错:‐1

我们用shmdt将p删除后,用memcpy(p,“hello”,5)将5个字符写到地址映射p中。p已经被删除了,这时又写内容到里面就会报错。

5.shmctl函数

4.int shmctl(int shm_id, int command, struct shmid_ds *buf);
//删除共享内存对象
参数:
shmid:要操作的共享内存标识符
cmd :
IPC_STAT (获取对象属性)‐‐‐ 实现了命令ipcs ‐m
IPC_SET (设置对象属性)
IPC_RMID (删除对象) ‐‐‐实现了命令ipcrm ‐m
buf :指定IPC_STAT/IPC_SET时用以保存/设置属性
返回值:
成功:0
出错:‐1

shmctl删除共享内存对象

删除共享对象后我们可以看到建立的共享对象29没有了

shmctl封装ipcrm -m xx

要封装的指令分成了三个参数,ipcrm    -m         xx,这就需要main函数传入三个参数

这个不可以删除系统的shm

将字符型转化成整数的函数atoi()

shmid是整形,但是传进来的是字符型的,所以要进行转化

6.共享内存进程间通信

shm_write

shm_read和write用的是同一个地址,不需要再进行创建

写入之后有个延时三秒,要在这三秒内执行shm_ead才行正确读出数据,因为三秒后就会删除地址映射、删除共享内存对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SuperW

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

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

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

打赏作者

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

抵扣说明:

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

余额充值