【问题标题】:Is there a posix SIGTERM alternative on Windows? - (A gentle kill for console application)Windows 上是否有 posix SIGTERM 替代方案? - (控制台应用程序的温和杀戮)
【发布时间】:2011-01-01 17:25:39
【问题描述】:

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

如何在windows上以温和的方式做到这一点?

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

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

【问题讨论】:

    标签: c# .net windows winapi sigterm


    【解决方案1】:

    定义“温柔”:)

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

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

    为了两全其美,您可以发送“退出”,然后在进程句柄上等待一段时间(WaitForSingleObject())。如果守护进程没有在 5 秒内死亡,则终止它。

    如果守护程序的主线程倾向于长时间忙碌活动,则让守护程序启动一个后台线程,该线程除了等待指定事件之外什么都不做。要向该线程发出信号,请从 GUI 按名称打开事件,然后引发它。这取决于守护进程在检测到事件时要做什么,但至少它将是受控关闭。

    【讨论】:

    • 我没有实现任何双向通信。我只是使用标准输出。这就是我问这个问题的原因:)
    • 那么,简短的回答是没有信号,但有许多其他进程间通信机制。但大多数都需要双方合作。没有的是 TerminateProcess()。
    • 我终于创建了一个命名共享内存并将其用作与 gui 通信的一种方式。
    • 所以...没有快速的命令行修复方法吗?哇...我只是最小化了系统托盘弹出窗口,并希望 explorer.exe 以干净的方式关闭以使其重新启动并运行。
    【解决方案2】:

    Windows 没有您所想的信号。

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

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

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

    【讨论】:

    • GenerateConsoleCtrlEvent() 应该在进程外部工作。传递 PID。
    • 我在掩饰一些事情,但 dwProcessGroupId != PID 在最纯粹的意义上。
    • CtrlEvent 看起来像解决方案让我试试。
    • 甚至还有一篇关于这个的博客:danielkaes.wordpress.com/2009/06/04/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多