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