代码之家  ›  专栏  ›  技术社区  ›  Piotr Czapla

在Windows上是否有POSIX SIGTERM选项?-(对控制台应用的温和杀戮)

  •  6
  • Piotr Czapla  · 技术社区  · 15 年前

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

    我怎样才能在窗户上温柔地做呢?

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

    为了提供更详细的信息,守护进程应用程序是用python编写的,而gui是用c&windows格式编写的。

    2 回复  |  直到 13 年前
        1
  •  1
  •   Seva Alekseyev    15 年前

    定义“温柔”:)

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

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

    要同时使用这两种方法,您可以发送“quit”,然后在进程句柄上等待一段时间(waitForSingleObject())。如果守护进程没有消失,比如说,5秒,那么终止它。

    如果守护进程的主线程很容易长时间处于忙碌状态,那么让守护进程启动一个后台线程,该线程只会等待一个命名事件。要向该线程发出信号,请从GUI中按名称打开事件,然后引发它。这取决于守护进程在事件检测时要做什么,但至少它将是一个受控的关闭。

        2
  •  1
  •   Kevin Montrose    15 年前

    窗户没有信号干扰你的思维。

    有一些基础设施可以改变控制台应用程序处理(伪造的)sigterm和sigbreak的方式,主要是 SetConsoleCtrlHandler GenerateConsoleCtrlEvent 但这两种方法都只在控制台应用程序本身中使用,而不是从外部使用。

    值得注意的是,当Windows控制台应用程序接收到一个sigterm时,它所做的就是调用 ExitProcess 没有什么特别的。我并不是百分之百地了解python等价物是什么,但是无论标准的“exit”调用是什么,都应该是等价的。

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