MST

星途 面试题库

面试题:C语言中Linux内存映射错误处理基础

在Linux环境下使用C语言进行内存映射时,如果`mmap`函数返回`MAP_FAILED`,请列举至少3种可能导致此错误的原因,并简述如何使用`perror`函数获取错误信息。
32.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

以下是mmap函数返回MAP_FAILED可能的原因:

  1. 文件描述符无效:传递给mmap的文件描述符可能没有正确打开,或者已经关闭。例如,在调用mmap之前,没有使用open函数成功打开文件,或者在调用mmap之前意外关闭了文件描述符。
  2. 映射长度无效:映射的长度(length参数)可能为0或者负数。mmap要求映射长度必须是一个大于0的正整数。
  3. 权限不匹配mmapprot参数指定的内存保护权限与文件的实际权限不匹配。例如,试图以写权限映射一个只读文件。
  4. 地址对齐问题:如果指定了MAP_FIXED标志并且addr参数没有正确对齐,会导致错误。系统通常要求映射地址是页大小的整数倍。

使用perror函数获取错误信息的方法如下: 在mmap函数返回MAP_FAILED后,立即调用perror函数,它会根据errno的值输出对应的错误信息。例如:

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

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

    void *ptr = mmap(NULL, 1024, PROT_READ, MAP_PRIVATE, fd, 0);
    if (ptr == MAP_FAILED) {
        perror("mmap");
        close(fd);
        return 1;
    }

    // 后续操作

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

上述代码中,如果mmap失败,perror("mmap")会输出类似于“mmap: 错误信息”的内容,其中“错误信息”是与errno对应的具体错误描述,方便开发者定位问题。