进程间通信(二)(共享内存)

共享内存

  • 通信原理:

开辟一块内存空间,各个进程将同一块物理内存空间映射到自己的虚拟地址空间中,通过虚拟地址进行访问,进而实现数据共享

特性:共享内存是最快的进程间通信方式,直接通过虚拟地址访问物理内存,相比较于其他方式少了两次数据拷贝

  • 操作流程

1,创建或打开共享内存

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

key:标识符  通过相同标识符,多个进程可以打开同一块共享内存

size:要创建的共享内存大小

shmflg:打开方式+权限:   IPC_CREAT|IPC_EXCL|0664

返回值:成功:操作句柄     失败-1

2,与进程建立映射关系

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

shimid:shmget返回的操作句柄

shmaddr:映射首地址,通常置为NULL

shmflg:   SHM_RDONLY--只读          0--可读可写

返回值:成功返回映射后的首地址    失败返回(void*)-1;

3,对共享内存进行内存操作

memcp   strcpy等等

4,与进程间解除映射关系

int shmdt(void* shmaddr)

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

5,删除共享内存

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

shmid:shmget返回的操作句柄

cmd:要对共享内存进行操作的类型    IPC_RMID--标记要删除的共享内存 映射链接数为0时删除共享内存,禁止新的映射连接

buf:用于获取或设置共享内存属性的

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

代码示例如下:

测试结果如下:

运行shmread  从共享内存中读取数据  如果共享内存中存在之前写入数据  将会一直打印之前写入的信息,且不会更新

运行shmwrite后,共享内存中的数据开始更新  

此时注意到,如果一直write向共享内存中写入数据,即使关闭read    更新内存中的数据在后台依然会一直更新

  • 综上总结:

通信原理:开辟一块物理内存,多个进程将同一块内存映射到自己的虚拟地址空间进行访问,进而实现数据共享

特性:

1,效率最高的进程间通信方式

2,生命周期随内核

注意:各个进程对共享内存的操作都是不安全的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

HT . WANG

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

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

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

打赏作者

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

抵扣说明:

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

余额充值