为什么fprintf不直接写入文件,除非使用fflush()?

时间:2013-11-28 13:16:07

标签: c linux file-io flush buffering

我编写了一个在文件中写入值的守护进程。我观察到的是,当我继续写文件时,文件中没有任何内容可见。另一方面,如果我使用fflush()方法,则字符在文件中可见。为什么fflush()有所作为?

3 个答案:

答案 0 :(得分:2)

因为缓冲。这意味着所有写入都存储在内存中的缓冲区中,直到刷新缓冲区为止。对于printf和朋友来说,如果它有换行符,或者您明确调用fflush,或者当然缓冲区已满。

答案 1 :(得分:1)

默认情况下,stdio是完全缓冲的,除非它写入终端,在这种情况下它是行缓冲的,或stderr,它根本没有缓冲。

您可以使用setbuf()功能禁用缓冲。

setbuf(fp, NULL);

答案 2 :(得分:0)

fprintf是libc提供的IO例程,它默认使用缓存机制,然后才真正写入文件。

字符通常被累积并异步传输到块中的文件,因此缓存必须超过libc(stdio)内部缓冲区大小(BUFSIZE,stdio.h中的#defined)或发生fflush()时。 / p>

如果你想最小化缓存,我建议你使用O_DIRECT或O_SYNC标志进行open调用,但是有一些限制:你必须确保缓冲区和其他东西的对齐。阅读O_DIRECT的{​​{1}} section

您还可以阅读this以获取有关如何控制libc缓冲的更多信息。