如果使用mmap()来读取文件,我怎样才能找到mmap()映射的数据的数量。
float *map = (float *)mmap(NULL, FILESIZE, PROT_READ, MAP_SHARED, fd, 0);
答案 0 :(得分:3)
mmap
system call无法读取数据。它只是映射virtual address space中的数据(通过间接配置您的MMU),并且成功的mmap
更改了虚拟地址空间。之后,您的程序将读取该数据(或不读取)。在您的示例中,如果map[356]
成功,您的程序可能会稍后阅读mmap
(并且您应该对其失败进行测试)。
仔细阅读mmap(2)的文档。第二个参数(在您的代码中,FILESIZE
)定义映射的大小(以字节为单位)。您可以检查它是sizeof(float)
的倍数,并将其除以sizeof(float)
,以获取map
中有意义且从文件中获取的元素数。映射的大小向上舍入为多个页面。 mmap(2)的man
页说:
文件以页面大小的倍数映射。对于一个文件 不是页面大小的倍数,剩余内存在归零时归零 映射,并写入该区域不会写入文件。
数据映射到pages。页面通常为4096字节。详细了解paging。
页面大小由getpagesize(2)或sysconf(3)返回_SC_PAGESIZE
(通常为4096)。
考虑阅读一些像Operating Systems: Three Easy Pieces这样的书(可免费下载),以了解virtual memory的工作原理以及memory mapped file的内容。
在Linux上,/proc/
文件系统(请参阅proc(5))对于了解某个进程的虚拟地址空间非常有用:在终端中尝试cat /proc/$$/maps
,并阅读更多内容以了解其输出。对于pid 1234的过程,请尝试cat /proc/1234/maps