有人知道为什么 mmap() 返回 MAP_FAILED 而不是 NULL 吗?在大多数系统上,MAP_FAILED 似乎是 (void*)-1。为什么 mmap() 不直接使用 NULL 呢?我知道地址 0x0 在技术上是一个有效的内存页面,而 (void*)-1 永远不会是一个有效的页面。然而我的猜测是 mmap() 实际上永远不会返回页面 0x0。例如,在 Windows 上,VirtualAlloc() 在出错时返回 NULL。
假设 mmap() 永远不会返回 0x0 是否安全?据推测,对 mmap() 的成功调用应该将可用内存返回给调用者。地址 0x0 永远不可用,因此它永远不会在成功时返回。在这种情况下,使用 0x0 作为失败标记似乎是明智的,这就是为什么我首先对 MAP_FAILED 的存在感到困惑。
最佳答案
在极少数情况下,mmap()
实际上会在地址 0x0 处创建映射。如今,它通常需要 root 权限(或者在 Linux 系统上将 mmap_min_addr
sysctl 设置为零)但这是可能的。如果创建了这样的映射,就可以写入该地址。
MAP_FAILED
永远不是 mmap()
的有效返回值,因此它可用作哨兵。
关于ios - 为什么 mmap() 使用 MAP_FAILED 而不是 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24562691/