【问题标题】:Why use mmap over fread?为什么使用 mmap 而不是 fread?
【发布时间】:2015-05-21 14:30:12
【问题描述】:

为什么/什么时候使用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);
}

【问题讨论】:

    标签: file c streaming mmap


    【解决方案1】:

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

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

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

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

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

    映射文件有缺点:

      1234563读取文件的效率可能低于仅读取文件。
    • 如果读取文件时出现 I/O 错误,您的应用程序很可能会被当场终止,而不是收到您的应用程序可以正常响应的系统调用错误。 (从技术上讲,您可以在前一种情况下捕获SIGBUS,但从这种情况中正确恢复并不容易。)

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

    • mmap() 的可移植性不如 read()(如您所建议的那样,属于 fread())。

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

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2019-09-10
      • 2017-01-24
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      相关资源
      最近更新 更多