我正在开发一个应该在多个进程之间共享数据的程序。我使用 mmap() 映射共享数据。但问题是mmap()返回的指针不是很“灵活”(与malloc()返回的指针相比)。缓冲区(共享数据)需要动态调整大小。所以现在我所做的仍然是操作堆中的共享数据(malloc、realloc..),然后将其复制到由 mmap() 返回的缓冲区。其他进程需要将共享数据从 mmap() 缓冲区加载到堆中。
这会带来一些性能损失。我想知道是否有一种方法可以将堆中的数据直接分配给 mmaped 文件而无需复制?
最佳答案
使用 mremap
扩大 mmap 区域。
// first grow the underlying file, then:
char *newp = mremap(p, oldsize, newsize, MREMAP_MAYMOVE);
if (newp == MAP_FAILED) {
// handle error, probably munmap(p)
}
p = newp;
MREMAP_MAYMOVE
告诉 mremap
它可能会更改映射的虚拟地址。这并不意味着它必须复制任何数据,只是它改变了页面在虚拟地址空间中的映射。
关于c - 在不复制的情况下将堆数据保存在映射文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22047210/