爲什麼以下代碼可以正常工作?POSIX系統上的內存映射文件保持同步
void continuous_mmap (void)
{
struct stat buf;
int fd = open("file_one", O_RDONLY), i;
char *contents;
fstat(fd, &buf);
contents = mmap(NULL, buf.st_size, PROT_WRITE, MAP_PRIVATE, fd, 0);
close (fd);
mprotect(contents, buf.st_size, PROT_READ);
for (i = 0; i < 15; i++) {
printf ("%s\n", contents);
sleep (1);
}
munmap(contents, buf.st_size);
}
首先,文件保持同步(外部編輯和保存文件自動打印更新的內容),即使附加到文件。我的代碼如何能夠訪問超出我已映射的字節數(初始文件大小),而不進行分段?是否因爲mmap
總是將系統頁面大小加起來?如果是這樣,這種行爲是否可以依賴於POSIX
系統(我在mmap
手冊頁中找不到任何此類要求)。
其次,文本如何自動附加'0'
?是否因爲非映射字節自動歸零?這種行爲可以依賴嗎?
添加一個'contents [0] ++;內容[0] - ;''在'關閉'之後和'mprotect'沒有幫助之前 - 這個過程仍然會看到這些變化。 – sanjoyd 2010-11-12 06:25:53
@theDigtialEngel:這隻會觸及第一頁,所以我認爲後續頁面仍然是共享的。 – caf 2010-11-12 11:28:44
雖然這在一般情況下會有意義,但我測試此代碼的文件不到一頁紙長。 – sanjoyd 2010-11-13 04:40:42