我在C
写了一个小程序FILE *fp = fopen("/tmp/file", "w+");
char *buf = "hello";
fwrite(buf, 1, strlen(buf), fp);
for(;;);
在shell上我使用cat来读取内容,文件为空,因为没有调用fflush。我的问题是它会永远保持这样吗,还是会在某个时候将数据推送到磁盘上?
换句话说,fwrite调用是否跨越文件系统边界到VM子系统,如果是,那么应该在某个时候调用页面守护进程,这将把内容刷新到文件。如果没有,那么数据将永远保留在那里,直到文件关闭或刷新。
答案 0 :(得分:4)
每个 stdio FILE
都有一个内部缓冲区(有关详情,请参阅setvbuf)。 fwrite
或fprintf
或fputs
调用正在填充该缓冲区。它将被写入文件系统(使用write(2)系统调用,在内核中执行)仅在满时或调用fflush
时。
您可能有行缓冲(例如stdout),然后当缓冲区中出现换行符时会触发write
P.S。尝试strace
你的程序,以了解它正在做什么。
答案 1 :(得分:3)
fwrite在写入系统调用之上添加缓冲。这个缓冲发生在客户端库(libc)中,所以在你的情况下你可以永远等待,因为在libc中没有运行异步线程,它自己进行刷新。
答案 2 :(得分:3)
FILE *缓存是在libc中实现的,所以答案是否定的:内核没有看到你的数据,它永远不会。