ios - 为什么 mmap() 使用 MAP_FAILED 而不是 NULL?

标签 ios linux macos posix mmap

有人知道为什么 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/

相关文章:

ios - NSBundleResourceRequest bundlePath

php - 使用 libreoffice 使用 --headless --convert-to 标志将 .doc(x) 转换为 PDF/A-1a 格式

c++ - macOS (OSX) 上的 ncurses 找不到 xterm-256color

ios - 我可以将一个 UIScrollView 放在另一个 UIScrollView 中吗

objective-c - 委托(delegate)给 'Parent' ViewController 最佳实践

iphone - 子类化 UINavigationController 以在 View 之间进行自定义导航

c++ - ld 找不到 glfw3

c - 为什么 posix_spawn() 在 popen() 工作的地方失败?

java - 最大化 JFrame 会导致 MouseMoved 事件停止触发

macos - Mac OS X : Can one process render to another process's window?