快速关闭mmap,丢弃未刷新的更改

时间:2015-07-08 16:10:48

标签: linux mmap virtual-memory

我使用mmap'ed文件作为虚拟内存竞技场 - 文件是手动分配的,因为我想控制它的位置。在munmap上,缓冲区的所有当前内容都被刷新到文件中,但我并不真正需要文件内容。是否可以简单地丢弃mmap区域而不回写?

Linux特定的解决方案没问题。

我的意思是

char* myswaparea = "/tmp/myswaparea";
int64_t len = 1LL << 30;
fd = open(myswaparea, O_CREAT|O_RDWR, 0600);
ftruncate(fd, len);
void* arena = mmap(NULL, len, .... fd ...);
/* use arena */
munmap(arena, len);  /* here comes an unnecessary flush */
close(fd);
unlink(myswaparea);

1 个答案:

答案 0 :(得分:1)

如果您不需要/想要将更改写回文件,请在创建地图时使用MAP_PRIVATE标志(mmap(2)的第4个参数)。

从联系手册:

  

MAP_PRIVATE

     

创建私有的写时复制映射。更新   映射对于映射同一文件的其他进程是不可见的   不会传递到底层文件。它没有具体说明   mmap()调用后对文件所做的更改是否可见   映射区域。

示例

fd = open("myfile", O_RDWR);
if (fd < 0) {
    /* Handle error... */
}
void *ptr;
size_t len = 1024;
ptr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
if (ptr == MAP_FAILED) {
    /* Handle error... */
}
/* ... */
if (munmap(ptr, len) < 0) {
    /* Handle error... */
}