void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
使用mmap
标志时,我不完全了解MAP_PRIVATE
的工作方式。我可以将大于文件length
的{{1}}传递给fd
吗?这样之后,我可以写入和读取超出文件大小但在mmap
范围内的内存吗?
我正在编写一些代码来计算文件的MD5。我决定编写仅将数据作为length
和void*
进行操作的函数,而不使用标准的库流函数。以前,我使用size_t len
,然后在使用文件之前将文件复制到一些malloc的内存中,但是事实证明,这对于大型文件来说非常慢,而且一旦发现malloc
就会变得很愚蠢。
我要解决的问题是,在计算任何数据的MD5之前,some padding and information is appended to the data that will be hashed.使用mmap
的先前解决方案,我只想计算需要追加多少数据,然后{{ 1}}并编写。现在,我正在预先计算需要添加多少数据,并将增加的长度传递给malloc
。在小文件上,这可以正常工作,但在大文件上尝试写入文件大小之外的地址会导致分段错误。
这正是我要尝试执行的操作:
realloc
我对mmap
有基本的误解吗?
答案 0 :(得分:1)
我可以将长度大于文件fd的长度传递给mmap吗?完成后,我可以读写超出文件大小但在长度范围内的内存吗?
这全部记录在mmap POSIX specification中:
系统应始终在页面末尾对所有部分页面进行零填充 宾语。此外,系统绝不会写出任何修改的内容 对象最后一页超出其末尾的部分。 地址范围内的引用从pa开始,并持续到 len字节到对象结束后的整个页面 传递SIGBUS信号。
mmap
长度大于文件大小,并且SIGBUS
。