面试题答案
一键面试mmap()函数基本原理
mmap() 函数用于将一个文件或者其它对象映射进内存。其原理是在进程的虚拟地址空间中创建一个新的映射区域,将文件的内容直接映射到该区域。这样,对文件的读写操作就可以通过对内存区域的读写来实现,而无需像传统的文件 I/O 那样频繁地进行用户态与内核态的切换。内核通过页表机制,将虚拟地址映射到物理内存地址,当访问映射区域时,如果对应的物理页面不在内存中,会触发缺页中断,内核会从文件中读取相应的数据到物理内存,并更新页表。
文件映射前预处理操作
- 打开文件:使用
open()
函数以合适的权限打开文件,例如以可读可写权限打开:
int fd = open("your_file", O_RDWR);
if (fd == -1) {
perror("open");
return -1;
}
- 获取文件大小:使用
lseek()
和stat()
函数都可以获取文件大小。- 使用
lseek()
函数:
- 使用
off_t file_size = lseek(fd, 0, SEEK_END);
if (file_size == -1) {
perror("lseek");
close(fd);
return -1;
}
lseek(fd, 0, SEEK_SET);
- 使用
stat()
函数:
struct stat sb;
if (stat("your_file", &sb) == -1) {
perror("stat");
close(fd);
return -1;
}
off_t file_size = sb.st_size;
- 文件截断(可选):如果要对文件进行写操作并且希望映射的区域大小固定,可以使用
ftruncate()
函数对文件进行截断,确保文件大小符合预期。例如:
if (ftruncate(fd, file_size) == -1) {
perror("ftruncate");
close(fd);
return -1;
}