私はプログラム、ある種のデータベースを書いています。のマニュアルを読んでいるときに、バッファをディスクにフラッシュfclose(3)
するように呼び出していることがわかりました(実際には OS バッファですが、今は関係ありません。いつでも呼び出すことができます)。fflush(3)
FILE*
fsync(2)
私は DB を書いているので、データの損失を防ぎたいのは明らかです。ディスク容量がなく失敗fflush(3)
したfclose(3)
場合 — データが失われます。
FILE*
エラーの後に使用fclose()
すると、未定義の動作が発生します
fflush(3)
そこで、 beforeを明示的に使用することを考えfclose(3)
、ユーザーにディスク容量不足を警告fflush(3)
し、しばらくしてから思い出すようにしました。
私はC標準を読んで、これは良い考えだと思いました。実際には、失敗した後fflush
、2 番目の呼び出しは常に 0 (エラーなし) を返しますが、実際には何もしません。fsync
役に立ちませんでした(データはRAMに保存されるのではないかと思いました)。
このような状況でデータの損失を防ぐにはどうすればよいですか? たぶん、いくつかの経験則があります。
ここに私のテストコードがあります:
#include <stdio.h>
int main()
{
FILE *a = fopen("/tmp/1", "wb")
if ( !a )
perror("fopen");
if ( fwrite("test", 1, 4, a) != 4 )
perror("fwrite"); // always OK, cause data is buffered
while( fflush(a) ) // ...second call will always return 0!
{
perror("fflush"); // if there is no disk space, I will get this perror, but ...
}
if ( fclose(a) ) // always ok, because calls only close(2)
perror("fclose");
return 0;
}