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

C++ 我可以只映射一个文件并修改它而不写回吗?,c++,mmap,C++,Mmap,我想在内存中打开一个文件,修改一些元素 代码如下: #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 <ios

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

代码如下:

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
intmain(intargc,char*argv[]){
int-fd;
如果(argc<2){
printf(“./app filename\n”);
出口(1);
} 
fd=打开(argv[1],O|u CREAT | O|u RDWR | O|u TRUNC,0777);
//fd=打开(argv[1],仅限O_rdo,0777);
lseek(fd,128*sizeof(int)+1,SEEK_集);
写(fd,“,1);
int*p=(int*)mmap(NULL,128*sizeof(int),PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
对于(int i=0;i<128;++i){
*(p+i)=i;
睡眠(1);

无法您想要
将\u PRIVATE
标志映射到mmap。它的定义如下:

MAP\u PRIVATE
: 在写入映射时创建专用副本。映射的更新对于映射同一文件的其他进程不可见,并且不会传递到基础文件。未指定在mmap()调用后对文件所做的更改是否在映射区域中可见


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

mmap
不会“退出代码时回写”。对映射内存所做的更改将立即写入该文件(准确地说,只要操作系统觉得需要将这些内存页交换到磁盘,这种情况随时可能发生)。如果您不想修改该文件,请不要
mmap
它或不更改映射内存;这是不可能的。@IgorTandetnik谢谢,我认为您是对的。我只是检查了映射文件的修改时间,在退出代码时发现它已更改。我认为文件内容已被修改,请在关闭时显示不同的修改时间。我'我不确定我是否正确理解了您的问题,但如果您希望对映射的写入只影响进程的内存,而不被写回文件,请使用
MAP\u PRIVATE
而不是
MAP\u SHARED