我有一个使用SQLite3维护数据库文件的控制台模式程序。执行需要花一些时间,但是假设数据库发生写操作,则在任何时候取消它都应该是安全的。 (全部在Windows下)
从正在运行的程序的角度来看,在控制台上按CtrlC比在其上调用另一个程序更安全吗?
我注意到,如果调用TerminateProcess,我可能会损坏数据库-我认为这是因为程序没有机会完成写入。我的猜测是CtrlC更好,因为程序会获取信号并自行终止,而不是由OS杀死它。
请注意,该程序实际上并不处理信号(除非SQLite可以处理);我正在谈论Win32可执行文件的内置默认机制来处理CtrlC信号。
为了澄清/简化问题-鉴于此写入刚刚执行:
fwrite(buf, 1024*1024, 1, stream);
在此写入过程中,TerminateProcess的行为将与CtrlC不同吗?
最佳答案
所有这些都是令人信服的论点,但是唯一可以肯定的方法就是尝试一下。因此,我编写了一个简单的程序,该程序分配了一个1GB的缓冲区,为其分配了一些数据,然后使用单个fwrite()将其写入文件。我尝试了几种方法来使写入“破坏”数据(特别是我期望截断的文件):
在任何情况下,文件大小正确且数据正确,都无法阻止写入。尽管“杀死”会立即发生,但该过程将持续到写入完成为止。
从I/O角度看,TerminateProcess和CtrlC之间似乎没有结论-一旦写入开始,它似乎可以保证完成(除非停电)。
关于windows - TerminateProcess与Ctrl + C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1178902/