gpt4 book ai didi

macos - 使用 MMAP 读取时 OS X 上的页面错误

转载 作者:行者123 更新时间:2023-12-04 19:35:12 24 4
gpt4 key购买 nike

我正在尝试使用 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 平台与您习惯使用的平台不同,最好打开手册页。对于 OS X 上的 mmap,可以找到 here .它说

Conforming applications must specify either MAP_PRIVATE or MAP_SHARED.

因此,在第四个指定 0argument 在 OS X 中OK。我相信一般来说,这对 BSD 来说是正确的。

关于macos - 使用 MMAP 读取时 OS X 上的页面错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3764344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com