MST

星途 面试题库

面试题:C语言内存映射基础 - 实现文件读取

在Linux环境下,使用C语言的内存映射函数(如mmap)实现从一个文本文件中读取前100个字节的数据,并将其打印到终端,简述代码实现思路及需要注意的要点。
23.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

代码实现思路

  1. 打开文件:使用open函数打开目标文本文件,获取文件描述符。
  2. 获取文件大小:使用lseek函数结合SEEK_END定位到文件末尾,再通过ftell获取文件大小(也可以使用stat函数获取文件大小信息)。
  3. 内存映射:调用mmap函数将文件映射到内存,得到一个指向映射内存区域的指针。
  4. 读取数据:从映射内存区域读取前100个字节的数据(需判断文件大小是否大于等于100字节)。
  5. 打印数据:使用write函数将读取的数据打印到终端。
  6. 解除映射:调用munmap函数解除内存映射。
  7. 关闭文件:使用close函数关闭文件描述符。

需要注意的要点

  1. 文件打开权限:确保以合适的权限打开文件,例如只读权限O_RDONLY
  2. 错误处理:对openmmapmunmapclose等函数的返回值进行检查,及时处理错误情况。
  3. 文件大小判断:在读取前100个字节时,要判断文件实际大小是否足够,避免越界访问。
  4. 内存映射参数mmap函数的参数需正确设置,包括映射的起始地址(通常设为NULL让系统自动分配)、映射长度、保护权限、映射标志等。
  5. 解除映射与关闭文件:确保在使用完映射内存和文件后,正确调用munmapclose函数,避免资源泄漏。

示例代码(简化版,未全面处理错误)

#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>

int main() {
    int fd = open("test.txt", O_RDONLY);
    if (fd == -1) {
        perror("open");
        return 1;
    }

    struct stat sb;
    if (fstat(fd, &sb) == -1) {
        perror("fstat");
        close(fd);
        return 1;
    }

    size_t length = sb.st_size;
    if (length < 100) {
        length = length;
    } else {
        length = 100;
    }

    char *map = mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, 0);
    if (map == MAP_FAILED) {
        perror("mmap");
        close(fd);
        return 1;
    }

    write(STDOUT_FILENO, map, length);

    if (munmap(map, length) == -1) {
        perror("munmap");
    }
    close(fd);
    return 0;
}