【问题标题】:Why is the data write not reflected to the file using fprintf file stream为什么使用 fprintf 文件流写入的数据没有反映到文件中
【发布时间】:2014-02-27 17:30:26
【问题描述】:

这是我的程序:

#include <stdio.h>

int main() {
    FILE *logh;

    logh = fopen("/home/user1/data.txt", "a+");

    if (logh == NULL)
    {
        printf("error creating file \n");
        return -1;
    }

    // write some data to the log handle and check if it gets written..
    int result = fprintf(logh, "this is some test data \n");
    if (result > 0)
        printf("write successful \n");
    else
        printf("couldn't write the data to filesystem \n");

    while (1) {
    };

    fclose(logh);
    return 0;
}

当我运行这个程序时,我看到文件正在被创建,但它不包含任何数据。我的理解是,在将数据实际写入文件系统之前,内存中有数据缓存,以避免多个 IO 以提高性能。而且我也知道我可以在程序中调用 fsync/fdatasync 来强制同步。但是我可以从外部强制同步而不必更改程序吗?

我尝试从 Linux shell 运行 sync 命令,但它不会使数据出现在文件中。 :(

如果有人知道任何替代方法,请提供帮助。

一个有用的信息:我对此进行了更多研究,最后发现了这一点,要完全删除内部缓冲,FILE 模式可以使用int setvbuf(FILE *stream, char *buf, int mode, size_t size) 设置为_IONBF

【问题讨论】:

  • fflush(logh);男人冲洗
  • 另外,请务必检查 fopen() 的返回值。
  • 是的,谢谢,我知道他们,但有什么方法可以做到这一点而无需更改程序。我的意思是从shell命令或其他东西将进程的所有文件数据缓存刷新到文件系统
  • 没有办法不改变程序..当它执行while(1)时,要写入的数据仍然在程序的内存中

标签: c linux filesystems


【解决方案1】:

使用FILE 指针的 IO 函数将要写入的数据缓存在程序内存中的内部缓冲区中,直到它们决定执行系统调用以“真正”写入它(对于普通文件,通常当大小为缓存的数据达到BUFSIZ)。 在那之前,没有办法从节目之外强制写作。

【讨论】:

    【解决方案2】:

    问题是由于您的while 语句,您的程序没有关闭文件。删除这些行:

    while (1) {
        };
    

    如果打算永远等待,则在执行while 语句之前使用fclose 关闭文件。

    【讨论】:

    • while 循环是故意编写的,以便在程序仍在运行时,写入应该同步而不关闭文件句柄。如果我在 while 循环之前关闭文件句柄,那么写入会自动发生,但我不明白为什么数据写入在很长一段时间后也没有发生
    • 我的意思是你很有可能将一些数据写入文件流,然后在显式关闭文件流之前忙了很长时间进行一些处理。同时,数据应该和文件系统同步吧?
    • 你必须要么fflush要么fclose。这很常见。软件不会知道何时发送数据。
    • 但是没有类似于open()O_SYNC 在每次write() 操作后自动同步数据的钩子吗?
    • 你没有写任何东西。缓冲区刚刚填满。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2019-09-13
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多