我对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");
}
答案 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
。