0

我有一块使用 mmap 分配的内存。然后我想将这块内存写入文件系统上的文件。我想知道是否有办法使用 mmap() 将现有内存块直接指向文件描述符,或者我是否必须将整个内存块复制到使用文件描述符创建的新 mmap() 区域?

4

3 回答 3

0

您将拥有它的顶部副本,除非您可以mmap首先使用临时文件创建它,然后在您想要“保存”它时重命名该文件。

我不熟悉所有的实现,我仔细研究过 Linux 的实现,但我相信这适用于所有情况:当你创建mmap区域时没有文件时,操作系统将使用“交换”作为afilemmap地区。由于文件内容和内存内容之间存在映射,因此您不能轻易更改该映射的内容(尽管它可能在技术上可能实现,但如果您有一个可能会相当“昂贵” 4GBmmap区域,其中只有一小部分在物理 RAM 中,其余部分在“磁盘上”)。

于 2013-09-10T16:12:13.657 回答
0

假设我们谈论的是纯 POSIX,则无法将mmap'd 区域附加到新 fd。我也不知道在 Linux 或 OS X 中有什么方法可以做到这一点。

您必须首先复制或mmap要写入的文件。如果由于某种原因您不希望文件立即出现,可以使用以下解决方法:

  • open文件系统中您想要最终文件的临时文件(相同的目录是安全的选择)
  • mmap它,修改它,写出更改
  • rename文件到它的最终位置。
于 2013-09-10T16:12:38.237 回答
0

之后,您可以使用vmsplicewithSPLICE_F_GIFT将内存放入管道中,splice或者copy_file_range可以执行所需的操作。

于 2019-05-06T17:00:10.810 回答