macOS Big Sur下mmap分配较大内存返回无效参数报错的原因是什么
mmap调用失败原因解答
- 核心问题出在
mmap的标志位参数配置不符合macOS系统要求:在macOS中使用MAP_ANONYMOUS创建匿名映射时,必须同时指定MAP_PRIVATE(私有映射,修改不回写文件)或MAP_SHARED(共享映射,修改对其他进程可见)两个标志中的任意一个,你当前的代码仅传入了MAP_ANONYMOUS,缺少必填的映射可见性标志,因此触发EINVAL错误,对应输出Invalid argument。 - 其余参数均符合规范:映射总长度为300048,系统会自动向上对齐到内存页大小不会报错;匿名映射对应的文件描述符设为-1、偏移量设为0、内存读写权限的配置都没有问题,剩余系统内存也足够支撑映射申请。
修复方案
修改mmap调用的标志位参数即可,示例如下(普通内存申请场景使用MAP_PRIVATE即可):
void *void_new_block = mmap(nullptr, sizeof(MyClass) + 300000, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
内容的提问来源于stack exchange,提问作者user16318341
相关产品推荐
相关产品推荐

