Linux 进程间通信之共享内存

我们在前面的进程管理文章中描述过进程的虚拟内存模型
这里写图片描述
那么我们在共享内存的时候其实是两个步骤,首先需要在内存中开辟一段空间作为共享内存,然后需要把内存中的共享内存映射到每个进程的虚拟内存中,完成通信
首先可以通过ipcs -m来查看当前系统中有没有共享内存
这里写图片描述
我们发现,目前还没有

1 shmget函数
该函数用来创建共享内存,它的原型为:int shmget(key_t key, size_t size, int shmflg);
第一个参数是一个唯一标示符
第二个参数是以字节为单位指定需要共享的内存容量
第三个参数是权限标志位,它的作用与open函数的mode参数一样,如果要想在key标识的共享内存不存在时,创建它的话,可以与IPC_CREAT做或操作。共享内存的权限标志与文件的读写权限一样,举例来说,0644,它表示允许一个进程创建的共享内存被内存创建者所拥有的进程向共享内存读取和写入数据,同时其他用户创建的进程只能读取共享内存
返回值:成功返回shm_id,错误返回-1

这是第一步,我们开辟一个共享内存区域
第二步是映射到进程的虚拟内存空间

2 shmat函数
函数原型:void *shmat(int shm_id, const void *shm_addr, int shmflg);
第一个参数是shmget函数返回的shm_id
第二个参数是指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址
第三个参数是一组标志位,通常为0
返回值:调用成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1

3 shmdt函数
该函数用于将共享内存从当前进程中分离。注意,将共享内存分离并不是删除它,只是使该共享内存对当前进程不再可用。它的原型如下:
int shmdt(const void *shmaddr);
参数shmaddr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1

我们来看一个例子:
建立两个进程,一个写,一个读,使用共享内存
这里写图片描述
这里写图片描述

执行结果:
这里写图片描述

再用ipcs -m看一下
这里写图片描述
我们发现共享内存开辟成功了

接下来我们是在另外一个进程中把共享内存的内容读出来

这里写图片描述

运行结果:
这里写图片描述

我们发现成功读出来了。

好了,Linux进程间通信之共享内存就总结到这里,如有问题,欢迎指正,谢谢。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值