gpt4 book ai didi

windows - TerminateProcess 与 Ctrl+C

转载 作者:可可西里 更新时间:2023-11-01 13:25:56 25 4
gpt4 key购买 nike

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

从正在运行的程序的角度来看,在控制台中按 CtrlC 是否比让另一个程序对其调用 TerminateProcess 更安全?

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

请注意,该程序实际上并不处理信号(除非 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com