为什么我不能写入mmaped文件

Akr*_*Akr 3 c mmap memory-mapped-files

首先,我创建一个文件并将一些字符回显给它,然后捕获它显示的文件:

sasdfasdfas

asfdasfsadf

然后在C程序中,我打开文件:

int fd=open("file",O_RDWR);
Run Code Online (Sandbox Code Playgroud)

mmaped文件:

unsigned char *addr=mmap(NULL,length,PROT_WRITE,MAP_PRIVATE,fd,pa_offset);
Run Code Online (Sandbox Code Playgroud)

其中length是关于fstat获取的文件大小的int,pa_offset是0.

open函数和mmap函数都返回良好,即open返回一个像3这样的正整数,mmap返回一个正确的地址,如0x7fd36999d000.

我从addr读取文件,一切正常.当我写它时,似乎在我打印程序中的内存时成功写入,但是如果我捕获它,实际的文件内容不会改变.

我尝试了一些像使用msync()的努力,但都有相同的结果.

你们谁会好心地告诉我在哪里被绊倒了?我只是想从mmap -_-写入文件

NPE*_*NPE 6

你想要MAP_SHARED而不是MAP_PRIVATE.

unsigned char *addr=mmap(NULL,length,PROT_WRITE,MAP_PRIVATE,fd,pa_offset);
                                                ???????????
Run Code Online (Sandbox Code Playgroud)

GNU C库手册(强调我的):

MAP_PRIVATE- 这指定不应将对区域的写入写回附加文件.而是为该进程创建一个副本,如果内存不足,该区域将正常交换.没有其他过程会看到更改.

MAP_SHARED- 这指定对区域的写入将写回文件.所做的更改将立即与其他进程共享同一文件.请注意,实际写作可能随时进行.msync如果使用传统I/O的其他进程获得文件的一致视图很重要,则需要使用 下面描述的内容.

man mmap.

换句话说,MAP_PRIVATE通过使用copy-on-write将映射的内存与后备文件分开.