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

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

Solutions Collecting From Web of "为什么fprintf不直接写入文件,除非使用fflush()?"

因为它是缓冲的 。 这意味着所有写操作都存储在内存中的缓冲区中,直到缓冲区被刷新。 对于printf和朋友,当它有一个换行符,或者你明确地调用fflush ,当然如果缓冲区变满了。

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

您可以使用setbuf()函数禁用缓冲。

 setbuf(fp, NULL); 

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

字符通常是以块的形式累积并异步传输到文件中的,所以缓存必须超过libc(stdio)的内部缓冲区大小(BUFFIZE,在stdio.h中定义#)或者发生了fflush()。

如果你想尽量减少缓存,我建议你open呼叫使用O_DIRECT或O_SYNC标志,但有一些限制:你必须确保你的缓冲区和其他东西对齐。 阅读man 2 openO_DIRECT 部分 。

你也可以阅读这个关于如何控制libc缓冲的更多信息。