为什么以下代码可以正常工作?
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'
?是因为非映射字节自动归零吗?这种行为可以依赖吗?