4

我创建了一个简单的记录器,它可以将所有重要的内容记录到一个文本文件中。我正在使用std::ofstream但有一个问题 - 当程序出于任何原因(如崩溃)没有关闭文件(调用std::ofstream::close())时,创建的日志实际上是空的(0 大小)。而且由于日志在特殊情况下(当出现问题时)最有用 - 你会看到问题。

有什么方法可以保护我的日志不受此影响吗?我可以在写完每几行并使用 append 之后尝试关闭文件——但这仍然不能保护我免受程序在记录过程中/关闭文件之前崩溃的情况。有什么解决方案还是我注定要失败?

4

2 回答 2

4

您应该使用冲洗方法,它可以精确地解决您面临的问题。

还有另一种方法可以被认为更安全,但需要更多的努力来实施和测试。该方法归结为所谓的进程间通信 (IPC)。简而言之,您可以将您的记录器实现为一个单独的记录器应用程序,该应用程序将通过特定协议(接口)与您的目标应用程序进行通信。您可以自己开发此类协议或使用现有协议之一(通常非常通用,即通用)。因此,如果您的目标应用程序崩溃,它不会拖拽 logger 应用程序,因此 logger 可以安全地完成其工作。

这种方法通常被一些庞大、复杂和安全关键的系统使用。但是,我想在您的情况下,这绝对是一种矫枉过正的做法,并且flush()在每次追加后都足够了。

于 2013-04-28T21:40:08.593 回答
2

在我们的商业应用中,我们有一个非常强大的解决方案。价格是不便携的。

我们安装了一个向量异常处理程序。在程序退出之前(这是迄今为止最常见的崩溃),如果出现未处理的操作系统异常,则会调用此处理程序。当它被调用时,你不能再调用 C++ 标准库函数(甚至 C 函数)。甚至fflush是不可靠的。

然而,调用基本的操作系统功能是可以的。不过要小心。设置操作系统调用的参数也不应该使用malloc。在崩溃实际发生之前已经设置了崩溃文件的名称,等等。请立即关闭文件,再次使用操作系统功能。

于 2013-04-28T23:56:50.850 回答