Linux 进程间通信 二、共享内存

共享内存

开辟一块儿物理内存空间,各个进程将这块物理内存通过页表映射到自己的虚拟内存空间中,通过访问虚拟地址,实现对物理内存的控制,进而实现数据共享。是进程间通信中最快的一种方式。

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.与进程间接触映射关系:int shmdt(const void *shmaddr);

  • shmaddr:shmat返回的映射的首地址。
  • 返回值:成功返回0,失败返回-1。

4.删除共享内存:int shmctl(int shmid, int cmd, struct shmid_ds *buf);

  • shmid:shmget返回的操作句柄。
  • cmd:要对共享内存进行的操作
    IPC_RMID:标记要删除的共享内存,并不会立即删除
    当映射连接数为0时,才会删除共享内存。
    当一个共享内存被标记了之后,就会禁止与新的进程创建映射连接。
  • buf:用于获取或设置共享内存的属性,简单使用置NULL即可。
  • 返回值:成功返回0,失败返回-1。

删除共享内存的时候,并不会立即删除,读和写的操作依然可以进行。在这里插入图片描述
在这里插入图片描述
只是标识符发生了变化,表示不能进行新的映射连接,等到映射连接数变为0的时候,这块儿共享内存就会被删除。
在这里插入图片描述
总结共享内存的特性

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

  1. 是效率最高的进程间通信。
  2. 生命周期随内核。

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

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值