【问题标题】:Why fprintf doesn't write directly into the file unless fflush() is used?为什么 fprintf 不直接写入文件,除非使用 fflush()?
【发布时间】:2013-12-14 13:22:32
【问题描述】:

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

【问题讨论】:

    标签: c linux file-io flush buffering


    【解决方案1】:

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

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

    setbuf(fp, NULL);
    

    【讨论】:

      【解决方案2】:

      因为它是缓冲的。这意味着所有写入都存储在内存中的缓冲区中,直到缓冲区被刷新。对于printf 和朋友来说,它有一个换行符,或者你显式调用fflush,或者当然是缓冲区满了。

      【讨论】:

      • 缓冲区大小是多少?溢出的时候应该写在文件上吧?
      • @SHREYASJOSHI 这是实现定义的,因此平台和库之间可能会有所不同。它还可以取决于文件的类型,例如stdout 可能有一个缓冲区大小,磁盘文件另一个。
      【解决方案3】:

      fprintf是libc提供的一个IO例程,在真正写入文件之前默认使用缓存机制。

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

      如果您想最小化缓存,我建议您在 open 调用中使用 O_DIRECT 或 O_SYNC 标志,但有一些限制:您必须确保缓冲区和其他内容的对齐。阅读O_DIRECTsectionman 2 open

      您也可以阅读this 了解有关如何控制 libc 缓冲的更多信息。

      【讨论】:

        猜你喜欢
        • 2020-11-04
        • 2019-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多