我用C写了一个小程序
FILE *fp = fopen("/tmp/file", "w+");
char *buf = "hello";
fwrite(buf, 1, strlen(buf), fp);
for(;;);
在 shell 上,我使用 cat 来读取内容,文件是空的,因为没有调用 fflush。我的问题是它会永远保持这种状态还是会在某个时候将数据推送到磁盘?
换句话说,fwrite 调用是否跨越文件系统边界到达 VM 子系统,如果是,则应在某个时间调用页面守护进程,将内容刷新到文件中。否则,数据将永远保留在那里,直到文件关闭或刷新。
最佳答案
每个 stdio FILE
都有一个内部缓冲区(更多信息请参见 setvbuf)。 fwrite
或 fprintf
或 fputs
调用正在填充该缓冲区。仅当已满或调用 fflush
时,它才会写入文件系统(使用 write(2) 系统调用,在内核中执行)。
您可能有行缓冲(例如,对于 stdout),然后当缓冲区中出现换行符时触发 write
附言尝试 strace
您的程序以了解它在做什么。
P.P.S Linux 是自由软件:您可以研究GNU libc 的源代码或 musl-libc -我觉得其来源更容易阅读。
关于linux - fwrite 的剖析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14164642/