我正在编写一个程序,某种数据库。当我阅读手册时,fclose(3)
我发现它调用fflush(3)
将缓冲区刷新FILE*
到磁盘(实际上是操作系统缓冲区,但现在没关系,我们总是可以调用fsync(2)
)。
因为我正在编写数据库,所以很明显我想防止数据丢失。如果没有磁盘空间并且fflush(3)
失败fclose(3)
——我们将丢失我们的数据,因为
FILE*
在错误后使用fclose()
将导致未定义的行为
所以我考虑过明确使用fflush(3)
before fclose(3)
,警告用户磁盘空间不足并fflush(3)
在一段时间后调用。
我已经阅读了C标准并认为这是一个好主意。在实践中,第二次调用失败后fflush
总是返回 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;
}