在Windows上有一个posix SIGTERM替代方案吗? - (一个温和的杀死控制台应用程序)

问题描述:

我有一个由GUI应用程序运行的控制台守护进程。当GUI应用程序终止时,我想停止守护进程。在Windows上有一个posix SIGTERM替代方案吗? - (一个温和的杀死控制台应用程序)

我怎样才能以温和的方式在窗户上做到这一点?

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

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

定义“温柔” :)

我假设已经没有在守护程序和图形用户界面之间发生的通信机制。只需引入一个“退出”命令并发送它。

如果你想杀死守护进程,即使它正在忙着做某事(或被冻结),使用TerminateProcess()。为了获得最好的结果,你可以发送“quit”,然后等待进程句柄一段时间(WaitForSingleObject())。如果守护进程没有死于例如5秒,则终止它。

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

+0

我没有任何双向沟通实施。我只使用stdout。这就是为什么我问这个问题:) – 2010-01-06 09:25:16

+0

那么,简单的答案是没有信号,但有很多其他的进程间通信机制。但其中大多数需要两端的合作。那个不是TerminateProcess()。 – 2010-01-06 14:26:15

+0

我终于创建了一个命名的共享内存,并将其用作与gui进行通信的一种方式。 – 2010-01-26 14:32:20

Windows没有以您想的方式显示信号。

有一些基础结构可以改变控制台应用程序处理(伪造的)SIGTERM和SIGBREAK的方式,主要是SetConsoleCtrlHandlerGenerateConsoleCtrlEvent,但两者都只用于控制台应用程序本身;不从外面。

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

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

+0

GenerateConsoleCtrlEvent()应该从进程外部工作。通过PID。 – 2010-01-05 17:25:36

+0

我正在对事物进行一些修饰,但dwProcessGroupId!=最纯粹意义上的PID。 – 2010-01-05 17:32:21

+0

CtrlEvent看起来像解决方案让我试试看。 – 2010-01-06 09:29:33