停电后文件内容丢失

  • 本文关键字:文件 linux stream
  • 更新时间 :
  • 英文 :


我使用c++ ofstream在Linux上编写日志文件。当我使用tail -f命令监视文件内容时,我可以看到内容被正确填充。但是如果停电了,我在断电后再次检查文件,最后几行记录就不见了。使用hexdump,我可以看到这些记录变成空字符''。我尝试了flush()和操纵器std::endl,无论如何它们都没有帮助。

它是真的尾巴显示给我实际上并没有写入磁盘,他们只是在缓冲区?在停电前没有更新inode表?我可以接受这个事实,但我不明白为什么记录变成空字符,如果他们没有写入文件。

顺便说一句,我尝试了谷歌的日志,并有相同的结果(一堆空字符在最后)。我还尝试了一个C库zlog。并发现它只丢失了最后的记录,但没有用空字符替换它们。

嗯,当您停电,然后再次启动系统时,linux内核尝试转发日志日志,以检测和纠正系统崩溃时从内存到磁盘的不一致。通常这意味着重做并提交所有可能的操作,直到系统崩溃,但撤销(和擦除)所有在系统崩溃时未提交的数据。

Linux(和其他un*x内核,如freebsd)有一个称为有序数据写入的功能,它强制元数据(如来自inode的块指针或目录条目)在之后更新,它们指向的实际数据被有效地写入磁盘,因此不一致性减少到最低限度。我不知道实际的linux实现,但是例如,在freebsd中,你所指向的(文件中的零块而不是实际写入的数据)在freebsd内核中是完全不可能的(好吧,你可以故意这样做,但不是偶然的)最有可能的事情是linux可能只是管理块信息而不是文件内容,或者它已经更新了文件大小指针而不是数据到那里。这应该不会发生,因为这是一个已经解决的问题。

另一件事是你写了多少数据,或者为什么你在屏幕上看到的东西在系统崩溃后没有出现。您可能听说过一种叫做延迟写入的东西,它允许内核在繁忙的系统上不立即将数据写入磁盘,而是等待一段时间,以便在内核内存缓冲区中解决更新,然后再将其写入磁盘,从而将写入操作保存到磁盘。磁盘写入,无论如何,在一些时间延迟后是强制的,这意味着linux中的5秒(我试着记住,上次我检查了很多时间,我怀疑在5到30秒之间),所以你最多可以失去最后5秒。

相关内容

  • 没有找到相关文章

最新更新