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