我有一个使用SQLite3维护数据库文件的控制台模式程序。执行需要花一些时间,但是假设数据库发生写操作,则在任何时候取消它都应该是安全的。 (全部在Windows下)

从正在运行的程序的角度来看,在控制台上按CtrlC比在其上调用另一个程序更安全吗?

我注意到,如果调用TerminateProcess,我可能会损坏数据库-我认为这是因为程序没有机会完成写入。我的猜测是CtrlC更好,因为程序会获取信号并自行终止,而不是由OS杀死它。

请注意,该程序实际上并不处理信号(除非SQLite可以处理);我正在谈论Win32可执行文件的内置默认机制来处理CtrlC信号。

为了澄清/简化问题-鉴于此写入刚刚执行:

fwrite(buf, 1024*1024, 1, stream);

在此写入过程中,TerminateProcess的行为将与CtrlC不同吗?

最佳答案

所有这些都是令人信服的论点,但是唯一可以肯定的方法就是尝试一下。因此,我编写了一个简单的程序,该程序分配了一个1GB的缓冲区,为其分配了一些数据,然后使用单个fwrite()将其写入文件。我尝试了几种方法来使写入“破坏”数据(特别是我期望截断的文件):

  • 调用TerminateProcess(通过perl的kill函数和Win32::Process::Kill)
  • 击中CtrlC
  • 使用任务管理器的“结束进程”
  • 使用Process Explorer的“杀死进程”

  • 在任何情况下,文件大小正确且数据正确,都无法阻止写入。尽管“杀死”会立即发生,但该过程将持续到写入完成为止。

    从I/O角度看,TerminateProcess和CtrlC之间似乎没有结论-一旦写入开始,它似乎可以保证完成(除非停电)。

    关于windows - TerminateProcess与Ctrl + C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1178902/

    10-10 22:40