linux - fwrite 的剖析

标签 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 子系统,如果是,则应在某个时间调用页面守护进程,将内容刷新到文件中。否则,数据将永远保留在那里,直到文件关闭或刷新。

最佳答案

每个 stdio FILE 都有一个内部缓冲区(更多信息请参见 setvbuf)。 fwritefprintffputs 调用正在填充该缓冲区。仅当已满或调用 fflush 时,它才会写入文件系统(使用 write(2) 系统调用,在内核中执行)。

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

附言尝试 strace 您的程序以了解它在做什么。

P.P.S Linux 是自由软件:您可以研究GNU libc 的源代码musl-libc -我觉得其来源更容易阅读。

关于linux - fwrite 的剖析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14164642/

相关文章:

c++ - 反转数据顺序

java - 如何等待文件创建

c# - 关于异常处理,删除文件的最有效方法是什么?

c# - 快速替换文件中的行首

linux - 回滚 <num> 不工作 screen

Linux 安全和/etc/shadow

正则表达式在文件中特定行的开头添加字符

c - 什么是 c 包含文件和保护?

c - 为什么读取文件功能崩溃?

php - 将文件指针向上移动一行(php)?