【问题标题】:Linux error from munmap来自 munmap 的 Linux 错误
【发布时间】:2014-04-01 07:37:07
【问题描述】:

我有一个关于 Linux 中 mmap 和 munmap 的简单问题:mmap 是否有可能成功但 munmap 失败?

假设所有参数都正确给出,例如看下面的代码sn -p。什么情况下会打印munmap failed!??

char *addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

... exit if mmap was not successful ...
... do some stuff using mmaped area ...

if( munmap(addr, 4096) == -1 ){
    printf("munmap failed!\n");
}

【问题讨论】:

    标签: c linux mmap


    【解决方案1】:

    是的,它可能会失败。来自mmunmap man pages

    成功完成后, munmap() 应返回 0;否则,它将返回 -1 并设置 errno 以指示错误。

    错误代码表明人们确实传递了无效参数。但是如果你传递你从 mmap() 得到的指针,并且正确的大小,那么它就不会失败。

    假设所有参数都正确给出,

    那么它就不会失败。这就是为什么大多数实现 (99%) 只是不检查 unmmap() 的返回值。在这种情况下,即使它失败了,你也不能做任何事情(除了通知用户)。

    【讨论】:

    【解决方案2】:

    如果munmap 接收到无效参数,则EINVAL 可能会失败。

    如果超出了进程的最大映射数,它也可能会失败并显示ENOMEM。如果您尝试取消现有地图中间的某个区域的映射,则可能会发生这种情况,这会导致生成两个较小的地图。

    您可以通过以下方式查看每个进程的最大映射数:

    sysctl vm.max_map_count
    

    你可以增加它,例如:

    sysctl -w vm.max_map_count=131060
    

    请注意,如果您不检查 munmap 的返回,您将无法获得任何线索何时导致崩溃或其他类型的故障,特别是在错误可能持续存在的长时间运行的进程中。

    例如,一个 munmap EINVAL 可以指向内存泄漏。

    还要注意mmap 失败并显示MAP_FAILED,这是(void*)-1 而不是NULL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2019-08-27
      • 2013-08-10
      • 2017-10-11
      • 1970-01-01
      相关资源
      最近更新 更多