在Windows上有一个posix SIGTERM的替代品吗? – (轻松杀死控制台应用程序)

我有一个由GUI应用程序运行的控制台守护进程。 当GUI应用程序终止时,我想停止守护进程。

我怎样才能在窗户上温柔地做到这一点?

在Linux上,我只是使用SIGTERM在控制台应用程序的Windows上是否有类似的机制?

为了提供更多的细节,守护程序应用程序是用python编写的,而gui是用C#&windows窗体编写的。

定义“温柔”:)

我假设守护进程和GUI之间已经存在通信机制。 只要引入一个“退出”命令并发送它。

如果你想杀死守护进程,即使它正在忙着做某事(或被冻结),使用TerminateProcess()。

为了获得最好的结果,你可以发送“quit”,然后等待进程句柄一段时间(WaitForSingleObject())。 如果守护进程不会在5秒内死亡,则终止它。

如果守护进程的主线程容易长时间处于繁忙活动状态,那么守护进程将启动后台线程,该线程除了等待命名事件外什么也不做。 要发信号通知该线程,请从GUI中按名称打开该事件,然后将其提升。 守护进程应该如何处理事件检测,但至少它会被控制关闭。

Windows没有像你想的那样有信号。

有一些基础设施可以改变控制台应用程序处理(伪造的)SIGTERM和SIGBREAK的方式,主要是SetConsoleCtrlHandlerGenerateConsoleCtrlEvent但两者都只能在控制台应用程序中使用。 不从外面。

值得注意的是,所有的Windows控制台应用程序在收到SIGTERM时都会调用ExitProcess ,没有什么特别的。 我不是100%的python等价物被调用,但是无论标准的“退出”调用应该是相等的。

我会建议编写一些代码来通知控制台应用程序,导致它调用ExitProcess本身。 如果这不是一个选项,使用TerminateProcess (相当于Process.Kill )从外部关闭控制台进程; 试图“伪造”一个ExitProcess是危险的MSDN文章中记录的原因。