在 Windows 机器上,我有许多场景,其中父进程将启动子进程。由于各种原因 - 父进程可能想要中止子进程但(这很重要)允许它清理- 即运行 finally 子句:
try:
res = bookResource()
doStuff(res)
finally:
cleanupResource(res)
(这些东西可能嵌入在更接近的上下文中 - 通常围绕硬件锁定/数据库状态)
问题是我无法找到在 Windows 中向孩子发出信号的方法(就像在 Linux 环境中那样),因此它会在终止之前运行清理。我认为这需要让子进程以某种方式引发异常(就像 Ctrl-C 那样)。
我尝试过的事情:
- os.kill
- 操作系统信号
subprocess.Popen
使用 creationFlags 并使用ctypes.windll.kernel32.GenerateConsoleCtrlEvent(1, p.pid)
abrt 信号。这需要一个信号陷阱和不优雅的循环来阻止它立即中止。ctypes.windll.kernel32.GenerateConsoleCtrlEvent(0, p.pid)
- ctrl-c 事件 - 什么也没做。
有没有人有办法做到这一点,以便子进程可以清理?