You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

第二次mmap调用失败(错误码22)求助:文本文件内存映射问题

mmap调用失败(错误码22)问题排查与解决

错误码22对应EINVAL,你的第二次mmap调用失败的核心原因是偏移量(offset参数)未按页面大小对齐。

问题分析

mmap系统调用要求offset参数必须是系统页面大小(通常为4096或8192字节,可通过sysconf(_SC_PAGESIZE)获取)的整数倍。你的代码中第二次mmap的偏移量是8,明显不符合对齐要求,因此触发EINVAL错误。

修复方案

  1. 先获取系统页面大小,将偏移量调整为页面大小的整数倍。比如把第二次mmap的偏移量改为页面大小的整数倍,或者动态计算对齐后的偏移。
  2. 修正代码里的语法错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:32:13