来自munmap的Linux错误

时间:2014-04-01 07:37:08

标签: c linux mmap

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

假设所有参数都已正确给出,例如,请参阅以下代码段。在什么情况下会打印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");
}

2 个答案:

答案 0 :(得分:2)

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

  

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

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

  

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

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

答案 1 :(得分:0)

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

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

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

sysctl vm.max_map_count

您可以使用例如:

来增加它
sysctl -w vm.max_map_count=131060

请注意,如果您没有检查munmap的返回,那么当您导致崩溃或其他类型的故障时,您将不会有任何线索,特别是在长时间运行的过程中错误可能会延续。

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

另请注意,mmap的{​​{1}}失败,MAP_FAILED而非(void*)-1