在Windows上有一个posix SIGTERM替代方案吗? - (一个温和的杀死控制台应用程序)
我有一个由GUI应用程序运行的控制台守护进程。当GUI应用程序终止时,我想停止守护进程。在Windows上有一个posix SIGTERM替代方案吗? - (一个温和的杀死控制台应用程序)
我怎样才能以温和的方式在窗户上做到这一点?
在Linux上,我只是使用SIGTERM在控制台应用程序的Windows上是否有类似的机制?
为了提供更多的细节,守护程序的应用程序是用python编写的,而gui是用C#编写的#& windows窗体。
定义“温柔” :)
我假设已经没有在守护程序和图形用户界面之间发生的通信机制。只需引入一个“退出”命令并发送它。
如果你想杀死守护进程,即使它正在忙着做某事(或被冻结),使用TerminateProcess()。为了获得最好的结果,你可以发送“quit”,然后等待进程句柄一段时间(WaitForSingleObject())。如果守护进程没有死于例如5秒,则终止它。
如果守护进程的主线程容易出现长时间的繁忙活动,请让守护进程启动一个后台线程,该线程除了等待命名事件之外什么都不做。要发出该线程的信号,请在GUI中按名称打开该事件,然后将其提升。守护进程应该如何处理事件检测,但至少它会被控制关闭。
Windows没有以您想的方式显示信号。
有一些基础结构可以改变控制台应用程序处理(伪造的)SIGTERM和SIGBREAK的方式,主要是SetConsoleCtrlHandler
和GenerateConsoleCtrlEvent
,但两者都只用于控制台应用程序本身;不从外面。
值得注意的是,所有的Windows控制台应用程序在收到SIGTERM时都会调用ExitProcess
,没什么特别的。我不是100%的python等价物,但是任何标准的“退出”调用都应该是等价的。
我建议编写一些代码来发信号通知控制台应用程序,导致它自己调用ExitProcess
。如果这不是一个选项,请使用TerminateProcess
(相当于Process.Kill)从外部关闭控制台进程;试图“伪造”ExitProcess
由于MSDN文章中提到的原因是危险的。
GenerateConsoleCtrlEvent()应该从进程外部工作。通过PID。 – 2010-01-05 17:25:36
我正在对事物进行一些修饰,但dwProcessGroupId!=最纯粹意义上的PID。 – 2010-01-05 17:32:21
CtrlEvent看起来像解决方案让我试试看。 – 2010-01-06 09:29:33
我没有任何双向沟通实施。我只使用stdout。这就是为什么我问这个问题:) – 2010-01-06 09:25:16
那么,简单的答案是没有信号,但有很多其他的进程间通信机制。但其中大多数需要两端的合作。那个不是TerminateProcess()。 – 2010-01-06 14:26:15
我终于创建了一个命名的共享内存,并将其用作与gui进行通信的一种方式。 – 2010-01-26 14:32:20