【发布时间】:2021-09-24 04:16:13
【问题描述】:
int main(){
int fd = open("aaaaaa.txt", O_CREAT | O_RDWR, 0666);
write(fd, "a", 1);
system("more aaaaaa.txt");
unlink("aaaaaa.txt");
close(fd);
return 0;
}
我想问一下为什么这个数据是立即写入文件的(通过'more'我可以看到这个),而不是在一段时间后直接写入内核页面缓存(不是真正写入文件) ,然后页面缓存被flusher线程真正写入文件。
【问题讨论】:
-
你的结论是基于什么?
-
write写入“文件”。more从“文件”中读取。无论“文件”是什么,从 c 程序的角度来看,页面缓存、磁盘上的神奇变化或刻在石头上的符号,都只是一个次要的实现细节。 -
注意这种行为是 POSIX 标准所要求的:任何可证明发生在
write()调用之后的操作都必须看到新数据。在这里,more的执行肯定发生在write()之后,因为在您的程序中system("more")出现在write()之后。因此,如果一个系统要拥有一个页面缓存,它必须是一致的,并且所有程序都必须从中读取,而不是直接从磁盘中读取。