面试题答案
一键面试以下是mmap
函数返回MAP_FAILED
可能的原因:
- 文件描述符无效:传递给
mmap
的文件描述符可能没有正确打开,或者已经关闭。例如,在调用mmap
之前,没有使用open
函数成功打开文件,或者在调用mmap
之前意外关闭了文件描述符。 - 映射长度无效:映射的长度(
length
参数)可能为0或者负数。mmap
要求映射长度必须是一个大于0的正整数。 - 权限不匹配:
mmap
的prot
参数指定的内存保护权限与文件的实际权限不匹配。例如,试图以写权限映射一个只读文件。 - 地址对齐问题:如果指定了
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
对应的具体错误描述,方便开发者定位问题。