mmap 创建共享内存映射

本文深入讲解了内存映射的概念及其实现方法,包括如何使用mmap函数创建内存映射、munmap函数释放映射,以及在使用过程中的注意事项。

所谓内存映射指的是 让一个磁盘文件与内存中的一个缓冲区相映射,进程访问这块内存时,就等同于访问文件对应映射部分,不必再调用 read / write 。

我们可以使用mmap函数来建立内存和文件某一部分的映射关系。


目录

一、共享内存映射的创建 / 释放

1、创建共享内存映射:mmap​​​​​​​

2、释放共享内存映射:munmap

二、mmap使用及其注意事项

1、mmap使用

(1) 打开文件

(2) mmap建立映射

(3) 通过映射向文件写入内容

(4) 完整代码

2、mmap使用注意事项

(1) 映射区只要建立成功,文件可以立即关闭

(2) 映射的文件大小必须大于0,否则会报总线错误

(3) 文件偏移量必须为0或者4K的整数倍

(4) 映射空间大小可以大于文件大小,但要注意不要访问区外部分

(5) 设置的映射空间大小 ≠ 实际分配的映射空间大小


一、共享内存映射的创建 / 释放

1、创建共享内存映射:mmap

mmap 函数的作用是创建共享内存映射。mmap函数的参数较多,几乎每一个参数都有注意事项,下面介绍的重点是mmap函数的参数。

(1) addr

用户可以手动指定要映射的内存地址,一般设置为NULL,让OS自动选择合适的内存地址,如果最后映射建立成功,mmap会返回内存中映射区的首地址。

(2) length

为内存中映射地址空间分配的字节数(length > 0)。这里分为了两种情况:

  • length > 文件映射部分大小
  • length < 文件大小

当 length < 文件映射部分大小 时,文件有一部分无法映射到内存。

当 length > 文件映射部分大小 时,有一部分无法映射到文件,这就意味着,即便向这部分内存写入内容,也不会反馈给文件。

因此,一般建议设置的映射空间大小直接和文件大小保持一致。文件大小的计算可以使用lseek函数。

// 起始偏移量为0,将文件指针移动到末尾(SEEK_END)
// 返回的结果就是 文件指针相对于起始位置的字节数
int size = lseek(fd, 0, SEEK_END);

(3) prot

指定内存映射空间的访问权限。其实就是要以何种形式来访问这块映射空间,如可读、可写、可执行等,可选值如下:

可选值 含义
PROT_READ 可读
PROT_WRITE 可写
 PROT_EXEC 可执行
PROT_NONE 不可访问

(4) flags

指定内存映射空间的映射方式。可以是共享,代表其他进程可以看到;可以是私有,代表其他进程看不到;也可以是匿名,一般用于有血缘关系之间的进程。可选值如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值