我有一个由 GUI 应用程序运行的控制台守护程序。当 GUI 应用程序终止时,我也想停止守护程序。
我怎样才能在 Windows 上以温和的方式做到这一点?
在 Linux 上,我只会使用 SIGTERM 在 Windows 上是否有类似的机制用于控制台应用程序?
为了提供更多细节,守护程序应用程序是用 python 编写的,而 gui 是用 C# 和 windows 形式编写的。
定义“温柔”:)
我假设在守护进程和 GUI 之间已经有一个通信机制。只需引入“退出”命令并发送即可。
如果您想杀死守护程序,即使它正忙于做某事(或被冻结),请使用 TerminateProcess()。
为了两全其美,您可以发送“退出”,然后在进程句柄上等待一段时间(WaitForSingleObject())。如果守护进程没有在 5 秒内死亡,则终止它。
如果守护进程的主线程倾向于长时间的繁忙活动,则让守护进程启动一个后台线程,该线程除了等待指定事件之外什么都不做。要向该线程发出信号,请从 GUI 按名称打开事件,然后引发它。这取决于守护进程在检测到事件时要做什么,但至少它将是受控关闭。
Windows 没有您所想的信号。
有一些基础设施可以改变(伪造的)SIGTERM 和 SIGBREAK 由控制台应用程序处理的方式,主要是SetConsoleCtrlHandler
但GenerateConsoleCtrlEvent
两者都只在控制台应用程序本身中使用;不是来自外面。
值得注意的是,Windows 控制台应用程序在收到 SIGTERM 时所做的所有事情都是 call ExitProcess
,没什么特别的。我不是 100% 知道什么叫做 python 等价物,但是任何标准的“退出”调用都应该是等价的。
我建议编写一些代码来向控制台应用程序发出信号,使其ExitProcess
自行调用。如果这不是一个选项,请使用TerminateProcess
(等效Process.Kill)从外部关闭控制台进程;ExitProcess
由于 MSDN 文章中提到的原因,试图“伪造”an是危险的。