我可以映射长度大于文件大小的文件吗?

时间:2019-11-25 02:49:20

标签: c file segmentation-fault mmap

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

使用mmap标志时,我不完全了解MAP_PRIVATE的工作方式。我可以将大于文件length的{​​{1}}传递给fd吗?这样之后,我可以写入和读取超出文件大小但在mmap范围内的内存吗?

我正在编写一些代码来计算文件的MD5。我决定编写仅将数据作为lengthvoid*进行操作的函数,而不使用标准的库流函数。以前,我使用size_t len,然后在使用文件之前将文件复制到一些malloc的内存中,但是事实证明,这对于大型文件来说非常慢,而且一旦发现malloc就会变得很愚蠢。

我要解决的问题是,在计算任何数据的MD5之前,some padding and information is appended to the data that will be hashed.使用mmap的先前解决方案,我只想计算需要追加多少数据,然后{{ 1}}并编写。现在,我正在预先计算需要添加多少数据,并将增加的长度传递给malloc。在小文件上,这可以正常工作,但在大文件上尝试写入文件大小之外的地址会导致分段错误。

这正是我要尝试执行的操作:

realloc

我对mmap有基本的误解吗?

1 个答案:

答案 0 :(得分:1)

  

我可以将长度大于文件fd的长度传递给mmap吗?完成后,我可以读写超出文件大小但在长度范围内的内存吗?

这全部记录在mmap POSIX specification中:

  

系统应始终在页面末尾对所有部分页面进行零填充   宾语。此外,系统绝不会写出任何修改的内容   对象最后一页超出其末尾的部分。   地址范围内的引用从pa开始,并持续到   len字节到对象结束后的整个页面   传递SIGBUS信号。

  1. 是的,您可以mmap长度大于文件大小,并且
  2. 访问文件末尾以外的任何页面(最后一个页面(可能是部分页面)除外)将产生SIGBUS