3
有沒有辦法檢查內存區域是否使用mmap映射到某個底層文件?如何檢查內存區域是否映射到文件?
我的意思是我想寫的函數:
int is_mmapped(void *ptr, size_t length);
它返回其完全映射使用mmap系統調用到文件存儲區域非零值。
有沒有辦法檢查內存區域是否使用mmap映射到某個底層文件?如何檢查內存區域是否映射到文件?
我的意思是我想寫的函數:
int is_mmapped(void *ptr, size_t length);
它返回其完全映射使用mmap系統調用到文件存儲區域非零值。
由於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
如預期。
可能重複:http://stackoverflow.com/questions/8362747/how-can-i-detect-whether-a-specific-page-is-mapped-in-memory – uesp 2014-09-06 20:32:37
是的,我以前見過這個。此問題被標記爲已解決,但不幸的是它不能解決我的問題。我嘗試了msync,並且使用valloc分配的內存沒有錯誤值。 – pako 2014-09-06 20:37:52
正如您發現的那樣,以這種方式使用msync是不可移植的。如果不存在這樣的存儲,msync()不需要任何作用。 – 2014-09-06 20:44:19