我使用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);
答案 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... */
}