2014-12-25 62 views
2

首先,我創建一個文件和回聲一些字符的微博,貓文件它表明:爲什麼我不能寫入文件mmaped

sasdfasdfas

asfdasfsadf

然後在C節目,我打開該文件:

int fd=open("file",O_RDWR); 

mmaped文件用:

unsigned char *addr=mmap(NULL,length,PROT_WRITE,MAP_PRIVATE,fd,pa_offset); 

其中長度是大約由FSTAT劉寶的文件的大小int和pa_offset是0

open函數和MMAP函數所有返回好,這是,開放返回正整數樣3,並且mmap返回一個正確的地址,如0x7fd36999d000。

我從地址讀取文件,一切正常。當我寫入它時,它似乎寫入成功,因爲我在程序中打印內存,但如果我捕獲它,實際文件內容不會更改。

我已經嘗試了一些努力,如使用msync(),但都具有相同的結果。

你們誰會友善地告訴我我在哪裏被絆倒?我只想從mmap寫入文件-_-

+0

僅僅因爲x86沒有沒有讀權限的寫權限並不意味着你應該從內存中讀取'mmap()ed'只寫。 – EOF

回答

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 - 這指定寫入區域將寫入 回到文件。所做的更改將立即與其他 進程共享同一個文件。 請注意,實際寫作可能隨時發生。如果使用傳統I/O的其他進程獲得文件的一致視圖很重要,則需要使用下面描述的 msync

參見man mmap

換言之,MAP_PRIVATE使用copy-on-write將映射內存從備份文件中分離出來。

+0

非常高效的答案,非常感謝! – Akr

+0

@Akr:很高興幫助。 – NPE

相關問題