Linux文件内存映射 mmap、msync、mremap
原链接:Linux文件内存映射文件内存映射文件映射的应用场景进程间共享信息实现文件数据从磁盘到内存的映射,极大的提升应用程序访问文件的速度mmap函数头文件:#include<sys/mman.h>函数原型:void *mmap(void *addr, size_t length, int port, int flags,int fd, off_t offset);int munmap
- 原链接:Linux文件内存映射
- 文件内存映射
- 文件映射的应用场景
- 进程间共享信息
- 实现文件数据从磁盘到内存的映射,极大的提升应用程序访问文件的速度
mmap函数
头文件:#include<sys/mman.h>
函数原型:
void *mmap(void *addr, size_t length, int port, int flags,int fd, off_t offset);
int munmap(void *addr, size_t length);
参数:
@addr:指向欲映射的内存起使地址。通常设为NULL,代表让系统自动选择地址,映射成功后返回该地址
@length:代表将文件中多大的部分映射到内存
@port:映射区域的保护方式。 可以是下列方式的组合:
PORT_EXEC -->执行
PORT_READ -->读取
PORT_WRITE -->写入
PORT_NONE -->不能存取
@flags:影响映射区域的各种特性。必须要指定MAP_SHARED 或 MAP_PRIVATE
MAP_SHARED - 映射区域数据与文件对应,允许其他进程共享
MAP_PRIVATE - 映射区域生成文件的copy,修改不同步文件
MAP_ANONYMOUS - 建立匿名映射。此时会忽略参数fd,不涉及文件,而且映射区域无法和其他进程共享。
MAP_DENYWRITE - 允许对映射区域的写入操作,其他对文件直接写入的操作将会被拒绝。
MAP_LOCKED - 将映射区域锁定住,这表示该区域不会被置swap
@fd:要映射到内存中的文件描述符。如果使用匿名内存映射时,即flags中设置了MAP_ANONYMOUS,fd设为-1。有些系统不支持匿名内存映射,则可以使用fopen打开/dev/zero文件,然后对该文件进行映射,可以同样达到匿名内存映射的效果。
@offset:文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小的整数倍。
返回值
如果映射成功,则返回指向映射的内存地址的指针
msync函数:实现磁盘文件内容与共享内存区的内容一致,即同步操作.
头文件:#include <sys/mman.h>
函数原型:int msync(void *addr, size_t length, int flags);
参数:
@addr :文件映射到进程空间的地址
@len:映射空间的大小
@flags:刷新的参数设置,
MS_ASYNC ->异步,调用会立即返回,不等到更新的完成
MS_SUNC ->同步,调用会等待更新完成之后返回
返回值:
成功返回 0 ,失败返回 -1
函数mremap: 扩大(或缩小)现有的内存映射
函数原型
Void* mremap(void *old_address, size_t old_size,size_t new_size,int flags);
头文件
#include<unistd.h>
#include<sys/man.h>
参数
@addr : 上一次已经映射到进程空间的地址
@old_size :旧空间的大小
@new_size : 重新映射指定的新空间的大小
@flags:取值可以为 0 或MREMAP_MAYMOVE, 0代表不允许内核移动映射区域,
MREMAP_MAYMOVE 则表示内核可以根据实际情况移动映射区域以找到一个
符合new_size大小要求的内存区域
返回值:成功返回指向新的内存地址的指针,失败则返回 MAP_FAILED
更多推荐
所有评论(0)