为什么要使用mmap而不是fread?

tar*_*yte 6 c streaming mmap file

为什么/何时使用更好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);
}
Run Code Online (Sandbox Code Playgroud)

Cel*_*ada 14

映射文件而不是将其作为流读取是有好处的:

  • 如果您打算对文件的不同宽间隔区域执行随机访问,则映射可能意味着只需要实际读取您访问的页面,同时保持代码简单.

  • 如果多个应用程序将访问同一个文件,映射它意味着它只会被读入内存一次,而不是每个应用程序将[部分]文件加载到其自己的私有缓冲区中的情况.

  • 如果文件不适合内存或占用大量内存,映射它可以提供适合的错觉并简化程序逻辑,同时让操作系统决定如何管理文件的旋转位物理记忆

  • 如果文件内容发生变化,您可以自动查看新内容.(这可能是一个可疑的优势.)

映射文件有一些缺点:

  • 如果您只需要对文件进行顺序访问,或者它很小,或者您只需要访问其中的一小部分,那么设置内存映射然后导致页面错误以实际导致内容被读取的开销可能效率较低而不只是阅读文件.

  • 如果读取文件时出现I/O错误,您的应用程序很可能会在现场被杀死,而不是接收应用程序可以正常响应的系统调用错误.(从技术上讲,你可以抓住SIGBUS前一种情况,但从这种事情中恢复正常并不容易.)

  • 如果您不使用64位体系结构并且文件非常大,则可能没有足够的地址空间来映射它.

  • mmap()read()(fread()根据你的建议)便携性较差.

  • mmap() 仅适用于常规文件(在某些文件系统上)和某些块设备.