Linux 下 POSIX 风格的共享内存

除了System V风格的进程间通讯外,还有一套POSIX的接口和实现。

先查一下文档:

shm_open(3) - Linux man page
Name
shm_open, shm_unlink - create/open or unlink POSIX shared memory objects
Synopsis
#include <sys/mman.h>
#include <sys/stat.h> /* For mode constants */
#include <fcntl.h> /* For O_* constants */
int shm_open(const char *name, int oflag, mode_t mode);

int shm_unlink(const char *name);

Link with -lrt.

背后的实现机制,文档里也说了:

The POSIX shared memory object implementation on 
Linux 2.4 makes use of a dedicated file system,
 which is normally mounted under /dev/shm.

这套API的操作实际上就是在/dev/shm下帮你新建了一个文件,然后可能帮你检查了一些环境要求。

鉴于/tmp和/dev/shm一样,都是系统自动挂载的tmpfs。

那我悟到了,以后要共享数据的时候,直接往/tmp里扔就行了。

/tmp和/dev/shm的默认大小都是最大内存的一半,这个有接口可以改。超出之后会触发swap之类的机制,可能因人而异。

在实践中,使用POSIX 的接口新建共享内存之后往里面写字符串,然后直接去cat /dev/shm下的文件都可以完整读取到,可见如果我自己不加机制来保护,那这个数据完全就是全局可见。

最后,喷一下 C 语言里的文件读写真的是难用。最后还是靠mmap这一套来实现了。不过损失了文件大小可伸缩的灵活特性。。

下面放上宋宝华老师的示例代码。他没unlink,不过毕竟tmpfs,无伤大雅。

写端:
在这里插入图片描述
读端:
在这里插入图片描述

使用mmap的好处就是,进行内存映射之后,在代码里就是无感使用了,用起来和local的数据结构一样。注意要(char *)mmap这样显示类型转化,不然在C++ 下可能会编译器报错或warn。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小羊苏C

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

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

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

打赏作者

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

抵扣说明:

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

余额充值