【问题标题】:Quickly close mmap discarding unflushed changes快速关闭 mmap 丢弃未刷新的更改
【发布时间】:2015-09-26 16:23:46
【问题描述】:

我正在使用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);

【问题讨论】:

  • 你试过 ftruncate(fd, 0); ?就在 munmap 之前...

标签: linux mmap virtual-memory


【解决方案1】:

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

来自手册页:

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... */
}

【讨论】:

  • 这不是我想要的。如果我理解正确,使用 MAP_PRIVATE,将永远不会写入支持文件 - 我想将其用作私有交换区域。
  • @grep 你特别问是否可以简单地丢弃 mmap 区域而不回写? - 答案是MAP_PRIVATE。没有其他方法可以阻止写回文件 - 地图是共享的,或者是私有的。如果它是共享的,您在内存中所做的修改会传播回文件;如果不是,它们将被丢弃。
  • 我猜测原始发布者希望在他的程序运行期间回写,但在他的程序退出时。我猜是因为那是我现在可以使用的。 :-) 我有一个程序将数据存储在文件支持的内存中以供分析,以防程序崩溃但如果它干净地退出,则文件将被删除,因此无需刷新数据。那么......是否有“munmap丢弃更改”选项?
猜你喜欢
  • 2012-05-31
  • 2015-11-01
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
相关资源
最近更新 更多