mmap 似乎失败,因为偏移量不是页面大小的倍数。您可以使用 perror 对此进行测试,并发现问题是无效的参数。如果你写:
data = mmap(NULL, 4000, PROT_READ, MAP_SHARED, fd, 8000);
perror("Error");
至少在我的 OS X 上会打印以下错误:
错误:参数无效
将偏移量从 8000 更改为 4096 或 8192 即可。 6144 没有,因此在此平台上它必须是 4096 的倍数。顺便,
printf("%d\n",getpagesize());
打印 4096。您应该将 mmap 的偏移量向下舍入到最接近的倍数,并在访问该区域时将余数添加到 i 中。当然,从该函数获取特定平台的页面大小。它可能在您已经声明的 unistd.h 中定义。
下面介绍如何正确处理偏移以及处理可能出现的错误。它打印位置 8000 处的字节:
int offset = 8000;
int pageoffset = offset % getpagesize();
data = mmap(NULL, 4000 + pageoffset, PROT_READ, MAP_SHARED, fd, offset - pageoffset);
if ( data == MAP_FAILED ) {
perror ( "mmap" );
exit ( EXIT_FAILURE );
}
i = 0;
printf("%c\n",data [i + pageoffset]);