2012-04-19 23 views
2

打开一个文件进行写操作后:在调用stat之前,我需要刷新还是关闭文件?

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

我可以假设文件被立即创建?它是安全的呼吁:

stat("./file", info); 

或者我应该更好:

fflush(file); 

fclose(file); 

事先?

编辑:fopen的调用后,假设非空文件

+0

嗯,首先,肯定检查'file!= NULL'。如果它是'NULL',则没有文件。我无法回答其他部分。 – Matej 2012-04-19 11:57:51

+2

当文件仍然打开时,您可以执行'fstat(fileno(file),&info);' – 2012-04-19 11:59:32

+0

fstat看起来像是一种可能性,我无法找到它是否能够保证从文件读取inode描述符将是存储在磁盘上的描述符。 – Ynv 2012-04-19 12:06:47

回答

2

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调用后对文件进行统计是安全的。

+0

嗯,我必须假设操作系统不需要设置并坚持inode在这一点上? – Ynv 2012-04-19 12:21:44

1

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

1

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

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

很少有时间在你需要把头冲到磁盘上的时候,就是系统崩溃的可能性。在这种情况下,如果您尚未使用类似fsync的方式将数据完全提交到磁盘,则在下次系统重新启动时可能会有数据丢失。

相关问题