c - 如何检测特定页面是否映射到内存中?

标签 c linux unix mmap

我想检测一个特定的页面是否已经映射到内存中。这里的目标是能够在使用固定内存地址调用 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/

相关文章:

linux - 编写一个 bash 脚本,将变量写入另一个文件的行尾

c - Linux克隆 "kills"主线程

linux - 引号取消 bash 中的命令传递给变量

regex - 纯粹使用 bash 正则表达式压缩工作目录

C静态变量问题

c - wait() 和 exit() 与父子进程

c - 将字符数组打印为 64 位整数

c++ - 计算 C 中 NSDate 之间的秒数

linux - 这个 zip 文件在解压缩时如何向我的控制台打印一条消息?

linux - 如何在禁用 tty 时输出子 shell