【问题标题】:mremap returns size, but should return a valid pointermremap 返回大小,但应该返回一个有效的指针
【发布时间】:2020-12-09 01:58:51
【问题描述】:

根据 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 值作为指向新内存映射的指针返回?

谢谢。

【问题讨论】:

  • Pilcrow 的回答已经解释了返回值的值,但是我希望除了返回值之外仍然是有效的指针(但您的程序的某些部分可能会丢失)。

标签: linux memory memory-management shared-memory mmap


【解决方案1】:

省略 MAP_PRIVATE。

MAP_PRIVATE 不是mremap 的有效标志。在我的系统上,MAP_PRIVATE == MREMAP_FIXED,这意味着mremap 会错误地expect a fifth argument,而您没有提供。

【讨论】:

  • 是的,你是对的。现在我得到一个指针值。我很惊讶 MAP_PRIVATE 会默认修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多