创建“可中断”可执行文件的最佳方法

创建“可中断”可执行文件的最佳方法

我的 Unix 可执行文件的工作是执行长时间计算,我向其中添加了中断/恢复功能,如下所述。

程序会定期将迄今为止找到的所有相关数据写入检查点文件中,然后可以将其用作“恢复”操作的起点。

为了中断程序,我使用Ctrl+ C
这种方法的唯一问题是,如果程序写入文件时发生中断,我会留下一个无用的半写入文件。

到目前为止我能找到的唯一修复如下:

  • 制作程序
  • 写入两个文件,以便在重新启动时其中一个文件可读。

有没有更干净、更好的方法来创建“可中断”的 Unix 可执行文件?

答案1

这在一定程度上取决于您是否只关心程序本身崩溃,还是整个系统崩溃。

在第一种情况下,您可以将新数据写入一个新文件,然后仅在完成写入后将其重命名为真实名称。这样,该文件将包含以前的或新的检查点数据,但绝不仅仅是部分信息。尽管在任何情况下部分写入都应该很少见,但如果我们假设检查点代码本身不太可能失败,并且如果相关的话信号被困以确保程序在退出之前完整保存新的检查点。 (除了SIGINT,我认为你最好也抓住SIGHUPSIGTERM。)

如果我们考虑整个系统崩溃的可能性,那么我不会只相信一个检查点文件。当系统从文件写入系统调用返回时,数据不太可能实际位于磁盘上。相反,操作系统和磁盘本身可能会缓存数据并在一段时间后实际写入。因此,保留一两个先前的检查点可以作为防止这种情况发生的故障保护措施。

答案2

您可以使用信号处理程序捕获SIGINT按下 时发送到进程的信号。Ctrl-C然后进程不会立即终止,但会调用信号处理程序。然后,您可以在信号处理程序中将结果写入文件。这是总体思路,在实践中您可能需要注意一些细节。

相关内容