2014-09-06 48 views
3

有没有办法检查内存区域是否使用mmap映射到某个底层文件?如何检查内存区域是否映射到文件?

我的意思是我想写的函数:

int is_mmapped(void *ptr, size_t length); 

它返回其完全映射使用mmap系统调用到文件存储区域非零值。

+0

可能重复:http://stackoverflow.com/questions/8362747/how-can-i-detect-whether-a-specific-page-is-mapped-in-memory – uesp 2014-09-06 20:32:37

+0

是的,我以前见过这个。此问题被标记为已解决,但不幸的是它不能解决我的问题。我尝试了msync,并且使用valloc分配的内存没有错误值。 – pako 2014-09-06 20:37:52

+0

正如您发现的那样,以这种方式使用msync是不可移植的。如果不存在这样的存储,msync()不需要任何作用。 – 2014-09-06 20:44:19

回答

2

由于0123'在评论中建议,/proc/self/maps可以帮助你做到这一点。

每一行看起来是这样的:

35b1a1f000-35b1a20000 r--p 0001f000 08:02 135522 /usr/lib64/ld-2.15.so 
START ADDR- END ADDR PERM OFFSET DEV INODE PATHNAME 

所有我们关心的是起始和结束地址,所以这并不需要多少代码:

#include <sys/mman.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 
int is_mmaped(void *ptr, size_t length) { 
    FILE *file = fopen("/proc/self/maps", "r"); 
    char line[1024]; 
    int result = 0; 
    while (!feof(file)) { 
     if (fgets(line, sizeof(line)/sizeof(char), file) == NULL) { 
      break; 
     } 
     unsigned long start, end; 
     if (sscanf(line, "%lx-%lx", &start, &end) != 2) { 
      continue; // could not parse. fail gracefully and try again on the next line. 
     } 
     unsigned long ptri = (long) ptr; 
     if (ptri >= start && ptri + length <= end) { 
      result = 1; 
      break; 
     } 
    } 
    fclose(file); 
    return result; 
} 

和一些测试:

int main(int argc, char *argv[]) { 
    void *test = mmap(NULL, 16384, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 
    printf("T %d\n", is_mmaped(test, 16384)); 
    printf("F %d\n", is_mmaped(test, 16385)); 
    printf("F %d\n", is_mmaped(test + 1, 16384)); 
    printf("T %d\n", is_mmaped(test, 1024)); 
    printf("T %d\n", is_mmaped(test, 256)); 
    printf("T %d\n", is_mmaped(test, 8)); 
    printf("T %d\n", is_mmaped(test + 16383, 1)); 
    munmap(test, 16384); 
    printf("F %d\n", is_mmaped(test, 16384)); 

    printf("T %d\n", is_mmaped(main, 32)); 
    return 0; 
} 

它打印:

T 1 
F 0 
F 0 
T 1 
T 1 
T 1 
T 1 
F 0 
T 1 

如预期。