fwrite的解剖学

时间:2013-01-04 20:41:26

标签: linux file file-io filesystems

我在C

写了一个小程序
FILE *fp = fopen("/tmp/file", "w+");
char *buf = "hello";
fwrite(buf, 1, strlen(buf), fp);
for(;;);

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

换句话说,fwrite调用是否跨越文件系统边界到VM子系统,如果是,那么应该在某个时候调用页面守护进程,这将把内容刷新到文件。如果没有,那么数据将永远保留在那里,直到文件关闭或刷新。

3 个答案:

答案 0 :(得分:4)

每个 stdio FILE都有一个内部缓冲区(有关详情,请参阅setvbuf)。 fwritefprintffputs调用正在填充该缓冲区。它将被写入文件系统(使用write(2)系统调用,在内核中执行)仅在满时或调用fflush时。

您可能有行缓冲(例如stdout),然后当缓冲区中出现换行符时会触发write

P.S。尝试strace你的程序,以了解它正在做什么。

P.P.S Linux是免费软件:您可以研究GNU libcmusl-libc的源代码 - 我觉得更容易阅读。

答案 1 :(得分:3)

fwrite在写入系统调用之上添加缓冲。这个缓冲发生在客户端库(libc)中,所以在你的情况下你可以永远等待,因为在libc中没有运行异步线程,它自己进行刷新。

答案 2 :(得分:3)

FILE *缓存是在libc中实现的,所以答案是否定的:内核没有看到你的数据,它永远不会。