【问题标题】:C++ MMap a file to memory and then get a file descriptor to that memoryC++ MMap 一个文件到内存,然后获取一个文件描述符到那个内存
【发布时间】:2011-09-13 20:21:34
【问题描述】:

我看到了这个帖子:system call to map memory to a file descriptor (inverse mmap)?

我想要一个我拥有的库,它希望其接口中的文件描述符能够获得一个文件描述符,该文件描述符将从我 mmaped 文件的内存区域读取。

我需要以下效果:

  1. mmap一个大文件(5gb)的内容到内存

  2. 获取该内存区域的文件描述符

  3. 调用一个获取该文件描述符的库并执行一些操作

我用于mmap 的原始文件描述符当然不起作用,因为它指的是磁盘上的文件。

到目前为止,我能够将文件mmap 存储到内存中,但是我调用了fmemopen,但是在调用该函数时没有设置fileno。任何指针?

我这样做的原因是我试图减少库在处理文件中的数据时所做的复制量。

【问题讨论】:

  • 你不能按照你的要求去做。你给出的理由非常笼统。每个人都希望他们的程序尽可能快且尽可能有效。告诉我们这就像告诉我们你这样做的原因是你想要快乐。确切地说,您希望通过这样做来实现什么?目标是尽快将一大块内存转储到文件中吗?
  • 本质上,程序读取一个大文件,并处理该文件,我希望这个过程尽可能快,我尝试使用ramfs,它提高了一点速度,但是现在,我正在尝试按照我的要求做,因为那样它会跳过使用 ramfs 创建的文件系统访问的开销。
  • 我编辑了您的问题,使您想要做的事情更加清晰。我希望编辑有用。

标签: c++ file mmap file-descriptor shared-memory


【解决方案1】:

从某种意义上说,您的要求似乎微不足道。从另一个意义上说,这是不可能的。

如果此内存区域表示您已经mmaped 的文件,那么您已经有一个文件描述符,因为您需要该文件描述符来调用mmap。如果您以MAP_SHARED 模式映射它,则通过文件描述符对文件的修改应自动显示在内存中,对内存的修改也应自动显示在文件中。这就是mmapMAP_SHARED 模式下的全部意义。

不过,查看手册页,您可能必须在某些系统上调用 msync 才能使您对内存所做的事情显示在文件中。

如果您有一些使用malloc 或类似方式获取的内存区域,然后只希望该内存区域获取文件描述符,这是不可能的。

【讨论】:

  • 谢谢你的回答,我只看Mmaped区域,没有写任何东西。
  • @Bill - 你需要写出任何信息吗?如果不是,为什么不只是 mmaping 文件一开始就足够好?
  • @Bill - 是否需要调用无法修复的代码,直接调用read 以从文件中获取信息?
  • 我不需要写出任何信息,只是纯粹的阅读。我正在使用的库需要文件描述符(例如由 open() 返回)到文件,但是当我在 mmap 映射的区域上调用 fmemopen() 时,未设置文件描述符。 (所以我不能在 fmemopen() 的结果上调用 fileno())
  • @Bill - 是的,那么您想要做的事情根本不可能。您需要修改库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多