如何解决mremap返回大小,但应返回有效的指针
根据mremap文档(https://www.man7.org/linux/man-pages//man2/mremap.2.html),“成功时mremap()返回一个指向新虚拟内存区域的指针。错误时,值为MAP_FAILED(即(void *)-1)返回,并正确设置了errno。“
下面是我的mremap代码。输入时,值设置如下:
old_address: (void *) 0x7ffff4957000 (140737296822272)
old_size: 8003584
new_size: 16007168
调用后,指针return_ptr为(void *)0x7a2000,它是old_size值(8003584),不是有效的指针值。
代码如下:
void * remap_shm(void *old_address,size_t old_size,size_t new_size)
{
void * return_ptr;
return_ptr = mremap(old_address,old_size,new_size,MAP_PRIVATE | MREMAP_MAYMOVE);
if (return_ptr <= 0){
printf("Error on remap! %s\n",strerror(errno)); }
return return_ptr;
}
如果我忽略MREMAP_MAYMOVE标志,它将失败。
我很迷惑。谁能解释为什么我将old_size值作为指向新内存映射的指针返回了?
谢谢。
解决方法
忽略MAP_PRIVATE。
MAP_PRIVATE不是mremap
的有效标志。在我的系统上,MAP_PRIVATE == MREMAP_FIXED,这意味着mremap
会错误地expect a fifth argument,而您没有提供。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。