2012-04-19 9 views
2

書き込み用にファイルを開いた後:statを呼び出す前にファイルをfflushまたは閉じる必要がありますか?

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

は、私は、ファイルがすぐに作成されたと仮定することはできますか?呼び出すこと、それは安全である:

stat("./file", info); 

または私はより良いはず:

fflush(file); 

または

fclose(file); 

は、事前に?

編集:fopenの呼び出しの後に非NULLファイルを想定し

+0

まず、 'file!= NULL'を確かめてください。 'NULL'の場合、ファイルはありません。私は他の部分に答えることはできません。 – Matej

+2

ファイルが開いている間に 'fstat(fileno(file)、&info);'を実行することができるかもしれません) –

+0

fstatが可能性があります。ディスクリプタはディスクに格納されたものになります。 – Ynv

答えて

2

fopen manual pageは言う:

モードをWであれば、WB、AB、+ W、WB +、+ Bワット、+、AB +、ファイルの が以前に存在しなかった場合、fopen() 関数はファイルのst_atime、st_ctime、およびst_mtime フィールドと親のst_ctimeおよびst_mtimeフィールドの更新をマークします ディレクトリ。

だから、私はfopen呼び出しが成功した直後にファイルを評価することは安全だと思います。

+0

ええと、OSはこの時点でiノードを設定してくれる必要はないと仮定しなければなりませんか? – Ynv

1

はい、論理的には可能です。読み取り専用ファイルシステムでの書き込み用のファイルを開くと失敗します。これは、fopen()/ open()が必要なチェックを行うことを示します。これを確認する他の方法は、open()のO_EXCLフラグに似たxというファイルを開くことです。

1

fopenへの呼び出しが成功すると、ファイルが作成されたことを意味します。ファイルはディスクにコミット(フラッシュ)されないかもしれません。しかし、statへの次の呼び出しがカーネルバッファからファイルをフェッチするときに、これについて心配する必要はありません。

したがって、fflushまたはfcloseはこの特定の場合には必要ありません。

システムをクラッシュさせる可能性があるときに、ディスクへのフラッシュについて頭を傷つける必要がある場所が数回あります。この場合、fsyncのようなものを使用してデータを完全にディスクにコミットしていない場合、次のシステム再起動時にデータが失われる可能性があります。

関連する問題