![]() |
1
5
所有这些都是令人信服的论点,但唯一确定的方法是尝试一下。所以我编写了一个简单的程序,它分配了一个1GB的缓冲区,给它分配了一些数据,然后使用一个fwrite()把它写到一个文件中。我尝试了几种方法来让写操作“损坏”数据(我希望得到一个被截断的文件,具体来说):
没有什么可以阻止写入-在每种情况下,文件的大小和数据都是正确的。尽管“杀戮”会立即发生,但这一过程会一直持续到写完为止。 结论性的是,终止进程和 Ctrl键 C 从I/O的角度来看——一旦写入开始,它似乎就可以保证完成(除非断电)。 |
![]() |
2
1
你的申请必须有机会处理 Ctrl键 C 和 Ctrl键 断裂 ,因为按键或信号(取决于配置),这意味着应用程序有机会进行一个干净的退出,这将是一个更软的方法来终止一个进程,如果没有其他东西,允许它有更多的执行时间。 TerminateProcess更像是一个累赘,应用程序无法处理它,它来自内核,如果应用程序能够处理它,这将导致挂起TerminateProcess处理程序并拒绝退出的“不可杀死”进程出现各种问题。 正如我所理解的,一旦在进程上调用TerminateProcess,它就不能再执行代码了,就是它,没有清理,没有关闭,它刚刚结束,你不能处理它,如果你能,而不是从安全的角度,它就是没有意义的。 关于处理Windows控制台信号的优秀代码项目文章: http://www.codeproject.com/KB/winsdk/console_event_handling.aspx 实现上面的一些信号处理,您可以确保数据库写入有机会在程序退出之前完成,而不是让它有机会完成。 你可以阻止TerminateProcess,但它的“不太礼貌”编程,更像是根工具包编程,我在root kit.com上看到过一篇关于这个的好文章,所以在那里搜索“进程不可战胜”,一旦你有了不可战胜的进程,它可以在收到这样的“请求”后在自己的时间关闭,并在海航之前执行任何清理。D,但这肯定是一个黑客。 但在我看来 Ctrl键 C 您当前看到的行为是由于它没有立即结束正在运行的进程。 |
![]() |
3
0
sqlite声称是原子的,即使在电源故障时也是如此,请参见 http://www.sqlite.org/atomiccommit.html . 唯一的例外是,某些磁盘系统会报告在数据实际写入磁盘盘前成功写入,即数据在磁盘缓存中,或操作系统位于sqlite中。参见 http://www.sqlite.org/lockingv3.html , 第6.0节如何损坏数据库文件。 终止的进程 must stop all running threads and complete pending I/O operations before they exit . 只要进程没有崩溃,就应该保证数据的完整性。 |
![]() |
4
0
我相信为了你的目的,使用它更安全 Ctrl键 C . 这将导致发送到程序的信号终止。如果程序不处理信号,它将在现场终止。 TerminateProcess强制终止进程和任何子线程。 从 MSDN :
有一些方法可以阻止TerminateProcess进程,但我怀疑SQLITE3是否会这样做。 |
|
amdixon · C-W正在删除我的命令提示符-如何停止 1 年前 |
|
Carb0n · 从用户加载n个星形(要显示的部分,而不是行) 1 年前 |
![]() |
Librarian · 为什么使用if表达式对作物无效? 1 年前 |
|
javispado · 更改python丰富面板中的标题颜色 1 年前 |
![]() |
Jens G. · 使用控制台代码更改HTML文本框值 1 年前 |