首先,我创建一个文件并向其中回显一些字符,然后显示它的文件:
sasdfasdfas
asfdasfsadf
然后在C程序中,使用以下命令打开文件:
int fd=open("file",O_RDWR);
用以下命令映射文件:
unsigned char *addr=mmap(NULL,length,PROT_WRITE,MAP_PRIVATE,fd,pa_offset);
其中length是关于fstat所获取文件大小的int值,而pa_offset为0。
open函数和mmap函数都返回良好,也就是说,open返回一个正整数,如3,而mmap返回一个正确的地址,如0x7fd36999d000。
我从地址读取文件,一切正常。当我对其进行写入时,似乎在我打印程序中的内存时成功写入了,但是如果我注意它,则实际文件内容不会更改。
我已经尝试了一些尝试,例如使用msync(),但是都具有相同的结果。
你们谁愿意告诉我我在哪里跌跌撞撞?我只想从mmap -_-写入文件
你要MAP_SHARED
而不是MAP_PRIVATE
。
unsigned char *addr=mmap(NULL,length,PROT_WRITE,MAP_PRIVATE,fd,pa_offset);
↑↑↑↑↑↑↑↑↑↑↑
从GNU C库手册(重点是我的):
MAP_PRIVATE
-这指定对区域的写操作永远不要写回附件。而是为该过程创建一个副本,如果内存不足,该区域将正常交换。没有其他进程会看到更改。
MAP_SHARED
-这指定对区域的写操作将被写回到文件中。所做的更改将立即与映射同一文件的其他进程共享。请注意,实际书写可能随时发生。msync
如果使用常规I / O的其他进程获取文件的一致视图很重要,则需要使用,如下所述。
请参阅man mmap
。
换句话说,MAP_PRIVATE
通过使用write-on-write将映射的内存与后备文件分离。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句