我可以只映射一个文件并修改它而不回写吗?

问题描述

我想在内存中打开一个文件,并修改一些元素。

代码如下:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<string.h>
#include<unistd.h>

#include <iostream>
using namespace std;

int main(int argc,char *argv[]) { 
    int fd;
    if (argc < 2) { 
      printf("./app filename\n");
      exit(1);
    } 
    fd = open(argv[1],O_CREAT | O_RDWR | O_TRUNC,0777);                                                                                                                                   
    // fd = open(argv[1],O_RDONLY,0777);
    lseek(fd,128*sizeof(int)+1,SEEK_SET);
    write(fd,"",1);
    int* p = (int*)mmap(NULL,128*sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    for (int i = 0;i < 128; ++i) { 
      *(p+i) = i;
      sleep(1);
      cout << "writing " << i << " as " << i << endl;
    } 
    close(fd);
    munmap(p,128*sizeof(int));
    return 0;
}

但我想保持文件干净,这意味着我不想在退出代码时回写。

我知道当代码退出时,无论我是否调用munmap,它都会写回。

那么,我怎样才能保持文件干净,并修改内存中的元素?

解决方法

您希望 MAP_PRIVATE 标志为 mmap。其定义如下:

MAP_PRIVATE: 创建私有的写时复制映射。映射的更新对映射同一文件的其他进程不可见,也不会传递到底层文件。未指定在调用 mmap() 之后对文件所做的更改在映射区域中是否可见。

这意味着您将获得该文件,但在您第一次更改该文件时,它会为您创建一个私人副本。所有更改都将转到此副本,并在程序退出后消失。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...