MST

星途 面试题库

面试题:C语言中mmap实现大文件读写的基础问题

在Linux环境下使用C语言的mmap()函数实现大文件读写,简述mmap()函数的基本原理,以及在进行文件映射前需要对文件做哪些预处理操作?
36.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

mmap()函数基本原理

mmap() 函数用于将一个文件或者其它对象映射进内存。其原理是在进程的虚拟地址空间中创建一个新的映射区域,将文件的内容直接映射到该区域。这样,对文件的读写操作就可以通过对内存区域的读写来实现,而无需像传统的文件 I/O 那样频繁地进行用户态与内核态的切换。内核通过页表机制,将虚拟地址映射到物理内存地址,当访问映射区域时,如果对应的物理页面不在内存中,会触发缺页中断,内核会从文件中读取相应的数据到物理内存,并更新页表。

文件映射前预处理操作

  1. 打开文件:使用 open() 函数以合适的权限打开文件,例如以可读可写权限打开:
int fd = open("your_file", O_RDWR);
if (fd == -1) {
    perror("open");
    return -1;
}
  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;
  1. 文件截断(可选):如果要对文件进行写操作并且希望映射的区域大小固定,可以使用 ftruncate() 函数对文件进行截断,确保文件大小符合预期。例如:
if (ftruncate(fd, file_size) == -1) {
    perror("ftruncate");
    close(fd);
    return -1;
}