为什么/何时使用
mmap()
更好,而不是从块中的文件流到字节数组的
fread()
?
uint8_t my_buffer[MY_BUFFER_SIZE]; size_t bytes_read; bytes_read = fread(my_buffer,1,sizeof(my_buffer),input_file); if (MY_BUFFER_SIZE != bytes_read) { fprintf(stderr,"File read Failed: %s\n",filepath); exit(1); }
解决方法
映射文件而不是将其作为流读取是有好处的:
>如果您打算对文件的不同宽度区域执行随机访问,则映射可能意味着只需要实际读取您访问的页面,同时保持代码简单.
>如果多个应用程序将访问同一个文件,映射它意味着它只会被读入内存一次,而不是每个应用程序将[部分]文件加载到其自己的私有缓冲区中的情况.
>如果文件不适合内存或占用大量内存,映射它可以提供适合并简化程序逻辑的错觉,同时让操作系统决定如何管理文件的旋转位和超出物理记忆.
>如果文件内容发生变化,您可以自动查看新内容. (这可能是一个可疑的优势.)
映射文件有一些缺点:
>如果您只需要对文件进行顺序访问,或者它很小,或者您只需要访问它的一小部分,那么设置内存映射然后引发页面错误以实际导致内容被读取的开销可能会更少比阅读文件更有效率.>如果读取文件时出现I / O错误,您的应用程序很可能会在现场被杀死,而不是接收系统调用错误,您的应用程序可以正常响应. (从技术上讲,你可以在前一种情况下捕获SIGBUS,但从这种事情中恢复正常并不容易.)>如果您不使用64位体系结构且文件非常大,则可能没有足够的地址空间来映射它.> mmap()比read()(你建议的fread()更不便携).> mmap()仅适用于常规文件(在某些文件系统上)和某些块设备.