1

我用C写了一个小程序

FILE *fp = fopen("/tmp/file", "w+");
char *buf = "hello";
fwrite(buf, 1, strlen(buf), fp);
for(;;);

在我使用 cat 读取内容的 shell 上,文件为空,因为 fflush 没有被调用。我的问题是它会永远保持这种状态,还是会在某个时候将数据推送到磁盘?

换句话说,fwrite 调用是否跨越文件系统边界到 VM 子系统,如果是,则有时应调用页面守护程序,它将内容刷新到文件中。如果不是,那么数据将永远保留在那里,直到文件关闭或刷新。

4

3 回答 3

4

每个stdio FILE都有一个内部缓冲区(请参阅setvbuf了解更多信息)。fwriteor fprintforfputs调用正在填充该缓冲区。仅当已满或调用fflush.

您可能有行缓冲(例如用于标准输出),然后write当缓冲区中出现换行符时触发

PS尝试strace你的程序来了解它在做什么。

PPS Linux 是免费软件:您可以研究GNU libcmusl-libc的源代码——我发现它们的源代码更易于阅读。

于 2013-01-04T20:48:34.450 回答
3

FILE* 缓冲是在 libc 中实现的,所以答案是否定的:内核看不到您的数据,而且永远不会。

于 2013-01-04T20:47:27.780 回答
3

fwrite 在 write 系统调用之上添加缓冲。这种缓冲发生在客户端库 (libc) 中,因此在您的情况下,您可以永远等待,因为 libc 中没有运行自行执行刷新的异步线程。

于 2013-01-04T20:46:55.457 回答