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 -_-写入文件
你想要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将映射的内存与后备文件分开.