我想检测一个特定的页面是否已经映射到内存中。这里的目标是能够在使用固定内存地址调用 mmap 之前执行此检查。以下代码说明了默认情况下在这种情况下发生的情况:mmap 静默地重新映射原始内存页面。
#include <sys/mman.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int page_size;
void *ptr;
page_size = getpagesize();
ptr = mmap(0, 10 * page_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
if (ptr == MAP_FAILED) {
printf ("map1 failed\n");
return 1;
}
((int *)ptr)[0] = 0xdeadbeaf;
ptr = mmap(ptr, 2 * page_size, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0);
if (ptr == MAP_FAILED) {
printf ("map2 failed\n");
return 1;
}
if (((int *)ptr)[0] != 0xdeadbeaf) {
printf ("oops, data gone !\n");
}
return 0;
}
我知道我可以打开并解析/proc/self/maps 以确定分配了哪个内存范围,并从中推断出我是否可以使用 mmap 安全地请求特定的内存范围,但我正在寻找合适的 API:有这样的事吗?
最佳答案
msync(addr, len, 0) 和检查 ENOMEM 似乎有效(通过相当肤浅的测试)。
关于c - 如何检测特定页面是否映射到内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8362747/