【问题标题】:Do I need to fflush or close a file before calling stat on it?在调用 stat 之前,我是否需要 fflush 或关闭文件?
【发布时间】:2012-04-19 20:22:46
【问题描述】:

打开文件写入后:

FILE *file = fopen("./file", "w");

我可以假设文件是​​立即创建的吗?打电话安全吗:

 stat( "./file", info);

或者我应该更好:

 fflush(file);

 fclose(file);

提前?

编辑:在 fopen 调用后假定非 NULL 文件

【问题讨论】:

  • 嗯,首先,一定要检查file != NULL。如果是NULL,则没有文件。不过我无法回答其他部分。
  • 您可以在文件仍处于打开状态时执行fstat(fileno(file), &info);
  • fstat 似乎是一种可能性。我找不到关于它是否保证例如从文件描述符读取的 inode 将是存储在磁盘上的文档的文档。

标签: c file stat


【解决方案1】:

fopen manual page 说:

如果模式是 w、wb、a、ab、w+、wb+、w+b、a+、ab+ 或 a+b,并且文件 以前不存在,成功完成后,fopen() 函数应标记更新 st_atime、st_ctime 和 st_mtime 文件的字段以及父级的 st_ctime 和 st_mtime 字段 目录。

所以我认为在 fopen 调用成功后对文件进行统计是安全的。

【讨论】:

  • 嗯,我必须假设操作系统此时不需要设置和坚持使用 inode?​​span>
【解决方案2】:

是的,从逻辑上讲我们可以做到。由于打开文件以写入只读文件系统失败。这表明 fopen()/open() 进行了必需的检查。其他确认方法是使用 x 类似于 open() 的 O_EXCL 标志打开文件。

【讨论】:

    【解决方案3】:

    如果对fopen 的调用成功,则表示文件已创建。该文件可能不会提交(刷新)到磁盘。但您不必担心这一点,因为下一次调用 stat 将从内核缓冲区获取文件。

    因此在这种特殊情况下不需要fflushfclose

    您需要对刷新到磁盘感到头疼的时候是系统可能崩溃的时候。在这种情况下,如果您没有使用 fsync 之类的方式将数据完全提交到磁盘,那么下次系统重新启动时可能会丢失数据。

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      相关资源
      最近更新 更多