我想检测特定页面是否已在内存中映射。目的是能够在使用固定内存地址调用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似乎可行(通过相当肤浅的测试)。