第二次mmap调用失败(错误码22)求助:文本文件内存映射问题
mmap调用失败(错误码22)问题排查与解决
错误码22对应EINVAL,你的第二次mmap调用失败的核心原因是偏移量(offset参数)未按页面大小对齐。
问题分析
mmap系统调用要求offset参数必须是系统页面大小(通常为4096或8192字节,可通过sysconf(_SC_PAGESIZE)获取)的整数倍。你的代码中第二次mmap的偏移量是8,明显不符合对齐要求,因此触发EINVAL错误。
修复方案
- 先获取系统页面大小,将偏移量调整为页面大小的整数倍。比如把第二次
mmap的偏移量改为页面大小的整数倍,或者动态计算对齐后的偏移。 - 修正代码里的语法错误:
exit(0;应该改为exit(0);
修改后的关键代码片段示例:
#include <unistd.h> // 引入sysconf所需头文件 // ... 其他原有代码 ... long page_size = sysconf(_SC_PAGESIZE); void *ptr2 = mmap(NULL, 8192, PROT_READ | PROT_WRITE, MAP_SHARED, fd, page_size); // 偏移量设为一个页面大小 if (ptr2 == MAP_FAILED) { printf("%d : Error : mmap failed with error %d\n", __LINE__, errno); exit(0); // 修正语法错误 }
额外说明
如果确实需要从偏移8的位置开始使用内存,可以映射更大的范围(从对齐的偏移开始),然后自己在内存中手动偏移8字节使用,避免直接用非对齐的offset调用mmap。
内容的提问来源于stack exchange,提问作者Abhishek Sagar
相关产品推荐
相关产品推荐

