我有一块使用 mmap 分配的内存。然后我想将这块内存写入文件系统上的文件。我想知道是否有办法使用 mmap() 将现有内存块直接指向文件描述符,或者我是否必须将整个内存块复制到使用文件描述符创建的新 mmap() 区域?
问问题
303 次
3 回答
0
您将拥有它的顶部副本,除非您可以mmap
首先使用临时文件创建它,然后在您想要“保存”它时重命名该文件。
我不熟悉所有的实现,我仔细研究过 Linux 的实现,但我相信这适用于所有情况:当你创建mmap
区域时没有文件时,操作系统将使用“交换”作为afile
为mmap
地区。由于文件内容和内存内容之间存在映射,因此您不能轻易更改该映射的内容(尽管它可能在技术上可能实现,但如果您有一个可能会相当“昂贵” 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
之后,您可以使用vmsplice
withSPLICE_F_GIFT
将内存放入管道中,splice
或者copy_file_range
可以执行所需的操作。
于 2019-05-06T17:00:10.810 回答