我正在尝试使用mmap在Mac OS X上对文件系统I / O进行基准测试。
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <stdio.h>
#include <math.h>
char c;
int main(int argc, char ** argv)
{
if (argc != 2)
{
printf("no files\n");
exit(1);
}
int fd = open(argv[1], O_RDONLY);
fcntl(fd, F_NOCACHE, 1);
int offset=0;
int size=0x100000;
int pagesize = getpagesize();
struct stat stats;
fstat(fd, &stats);
int filesize = stats.st_size;
printf("%d byte pages\n", pagesize);
printf("file %s @ %d bytes\n", argv[1], filesize);
while(offset < filesize)
{
if(offset + size > filesize)
{
int pages = ceil((filesize-offset)/(double)pagesize);
size = pages*pagesize;
}
printf("mapping offset %x with size %x\n", offset, size);
void * mem = mmap(0, size, PROT_READ, 0, fd, offset);
if(mem == -1)
return 0;
offset+=size;
int i=0;
for(; i<size; i+=pagesize)
{
c = *((char *)mem+i);
}
munmap(mem, size);
}
return 0;
}
我的想法是,我将映射文件或文件的一部分,然后通过取消引用文件而导致页面错误。我慢慢失去了理智,因为这根本无法完成,并且我之前在Linux上也做过类似的事情。
最佳答案
更改此行
void * mem = mmap(0, size, PROT_READ, 0, fd, offset);
至
void * mem = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, offset);
并且,请勿将
mem
与-1
进行比较。改用这个:if(mem == MAP_FAILED) { ... }
它更具可读性和便携性。
一般建议:如果您使用的是与以往不同的UNIX平台,那么打开手册页是个好主意。对于
mmap
上的OS X
,可以找到here。它说合格的应用程序必须指定MAP_PRIVATE或MAP_SHARED。
因此,在第四个上指定
0
在OS X中参数不正确。我相信
通常,对于BSD来说都是如此。
关于macos - 使用MMAP读取时OS X上的页面错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3764344/