【问题标题】:Accessing binary files with mmap vs fstream or fopen使用 mmap vs fstream 或 fopen 访问二进制文件
【发布时间】:2019-05-05 09:51:34
【问题描述】:

我不知道二进制文件可以用mmap() 读取。我以前认为mmap()只能用于Linux中的IPC(interprocess communication),在不相关的进程之间交换数据。

有人可以解释如何使用mmap() 读取文件吗?听说随机访问二进制文件有很大的优势。

【问题讨论】:

    标签: c++ c ipc system-calls mmap


    【解决方案1】:

    好吧,mmapping 文件的完成方式与 IPC 或映射匿名内存的方式相同。在映射匿名内存的情况下,未写入的部分将根据需要填充零页。

    在映射文件的情况下,对应于文件内容的页面在访问时(以及在写入时)从文件/或缓冲区缓存中读取。超出文件大小的读取或写入将导致SIGBUS。本质上,mmap 返回的指针可以以与malloc 返回的指针类似的方式来考虑,不同之处在于自动从 / 读取映射内的最大映射大小 / 直到文件结尾字节并可能透明地写入支持文件。

    例子:

    fd = open("input.txt", O_RDWR, 0666);
    fstat(fd, &stat_result); 
    char* contents = mmap(0, stat_result->st_size,
                          PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    

    (省略错误检查)

    执行之后可以认为contents指向一个stat_result->st_size字符的字符数组的第一个字节,可以像普通数组一样使用,操作系统会透明地把修改写回文件。


    使用mmap,操作系统将更好地了解文件的哪些部分应该保存在内存/缓冲区缓存中,哪些不应该。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多