首先,我创建一个文件并向其回显一些字符,然后捕捉它显示的文件:
sasdfasdfas
asfdasfsadf
然后在C程序中,我打开文件:
int fd=open("file",O_RDWR);
使用以下命令对文件进行mma:
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。
我从addr读取文件,一切正常。当我写它的时候,当我在程序中打印内存时,它似乎成功写入,但如果我捕获它,实际的文件内容不会改变。
我尝试了一些像使用msync()的努力,但都有相同的结果。
你们谁会好心地告诉我在哪里被绊倒了?我只想从mmap -_-
写入文件答案 0 :(得分:6)
您需要MAP_SHARED
而不是MAP_PRIVATE
。
unsigned char *addr=mmap(NULL,length,PROT_WRITE,MAP_PRIVATE,fd,pa_offset);
↑↑↑↑↑↑↑↑↑↑↑
来自GNU C library manual(强调我的):
MAP_PRIVATE
- 这指定永远不应该写入该区域 写回附件。而是复制一份 进程,如果内存不足,该区域将正常交换。 没有其他过程会看到变化。
MAP_SHARED
- 这指定将写入对区域的写入 返回文件。所做的更改将立即与其他人共享 进程mmaping相同的文件。 请注意,实际写作可能随时进行。你需要使用msync
,如下所述,如果其他进程使用很重要 传统的I / O可以获得文件的一致视图。
请参阅man mmap
。
换句话说,MAP_PRIVATE
使用copy-on-write将映射内存与支持文件分开。