为什么我不能写入mmaped文件

时间:2014-12-25 07:38:11

标签: c mmap memory-mapped-files

首先,我创建一个文件并向其回显一些字符,然后捕捉它显示的文件:

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 -_-

写入文件

1 个答案:

答案 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将映射内存与支持文件分开。