2014-09-06 68 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 

如預期。