mmap - 创建内存映射
作用: 将磁盘文件的数据映射到内存, 用户通过修改内存就能修改磁盘文件
函数原型
void *mmap(
void *adrr, // 映射区首地址,传NULL
size_t length, // 映射区的大小
® 100byte - 4k
® 不能为0
® 一般文件多大,length就指定多大
int prot, // 映射区权限
PROT_READ – 映射区必须 要有读权限
PROT_WRITE
PROT_READ | PROT_WRITE
int flags, // 标志位参数
® MAP_SHARED
◊ 修改了内存数据会同步到磁盘
® MAP_PRIVATE
◊ 修改了内存数据不会同步到磁盘
int fd, // 文件描述符
® 干嘛的文件描述符?
◊ 要映射的文件对应fd
® 怎么得到?
◊ open()
off_t offset // 映射文件的偏移量
® 映射的时候文件指针的偏移量
◊ 必须是4k的整数倍
◊ 0
);
返回值:
§ 映射区的首地址 - 调用成功
§ 调用失败:MAP_FAILED
munmap - 释放内存映射区
int munmap(void *addr, size_t length);
addr - -mmap的返回值,映射区的首地址
length -- mmap的第二个参数,映射区的长度
:
相关问题
1、 如果对mmap的返回值(ptr)做++操作(ptr++), munmap是否能够成功?
不能
2、 如果open时O_RDONLY, mmap时prot参数指定PROT_READ | PROT_WRITE会怎样?
报错,打开文件时指定的权限需要大于等于mmap设置的权限。
3、 如果文件偏移量为1000会怎样?
报错
4、 mmap什么情况下会调用失败?
各个参数的传参有问题,需要具体分析。
5、 可以open的时候O_CREAT一个新文件来创建映射区吗?
可以
6、 mmap后关闭文件描述符,对mmap映射有没有影响?
没有
测试源码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/mman.h>
#include <fcntl.h>
int main(int argc, const char* argv[])
{
int fd = open("aa.txt", O_RDWR);
if(fd == -1)
{
perror("open error");
exit(1);
}
// get file length
// len > 0
int len = lseek(fd, 0, SEEK_END);
void * ptr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if(ptr == MAP_FAILED)
{
perror("mmap error");
exit(1);
}
close(fd);
char buf[4096];
// 从内存中读数据
printf("buf = %s\n", (char*)ptr);
strcpy(ptr, "你是我儿子吗?");
int ret = munmap(ptr, len);
if(ret == -1)
{
perror("munmap error");
exit(1);
}
return 0;
}
测试结果
关键代码分析
其实mmap和malloc函数功能有点类似,使用它可以提供一种新的创建内存块的方法。