Linux--mmap存储映射
1、mmap概述
存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。是当从缓冲区中取数据,就相当于读文件中的相应字节。于此类似,将数据存入缓冲区,则相应的字节就自动写入文件
2、mmap的API
1、建立文件和内存的映射
#include<sys/mman.h>
void*mmap(void *addr ,size_t length,int prot,int flags, int fd, off_t offset);
功能:
建立文件和内存的映射
参数:
addr 地址,填NULL
length 长度 要申请的映射区的长度
prot 权限
PROT_READ 可读
PROT_WRITE 可写
flags 标志位
MAP_SHARED 共享的 -- 对映射区的修改会影响源文件
MAP_PRIVATE 私有的
fd 文件描述符 需要打开一个文件
offset 指定一个偏移位置 ,从该位置开始映射 (1024的整数倍)
返回值
成功 返回映射区的首地址
失败 返回 MAP_FAILED ((void *) -1)
2、拓展文件大小
#include<unistd.h>
#include<sys/types.h>
int truncate(const char*path,off_t length);
功能:
拓展文件大小
参数:
path 要拓展的文件
length 要拓展的长度
返回值:
成功 0
失败 -1
3、释放映射区域(只能解除本进程的映射)
int munmap(void * addr ,size_t length);
功能:
释放映射区域
参数:
addr 映射区的首地址
length 映射区的长度
返回值
成功 返回0
失败 返回 -1
示例代码
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<unistd.h>
#include<string.h>
int main(int argc,char const*argv[])
{
//通过open事先打开文件
int fd = open("tmp", O_RDWR | O_CREAT, 0666);
if (fd < 0)
{
perror("open");
return 0;
}
//拓展文件大小
truncate("tmp", 16);
//建立映射
char *buf = (char *)mmap(NULL, 16, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
//使用区域
strcpy(buf, "hello mmap");
//断开映射
munmap(buf, 16);
return 0;
}