【问题标题】:Gracefully terminate a command line application on Windows在 Windows 上优雅地终止命令行应用程序
【发布时间】:2023-03-10 03:06:01
【问题描述】:

我正在创建一个命令行应用程序,它会生成一个进程(由用户定义的命令,通常是 HTTP 服务器),当应用程序的工作完成后,我想让进程知道它应该终止。

在 UNIX 中,我可以通过发送 SIGTERM 来做到这一点,如果进程没有结束,那么我可以通过 SIGKILL 残忍地杀死它。

在 Windows 中,我很难找到 SIGTERM 方案的替代方案。我知道有taskkill /PID XXXX(没有/f!),但是

  1. 我没有找到关于taskkill /PID XXXX 在后台做什么的信息,因此我无法对其进行测试。我找不到如何处理 taskkill /PID XXXX 在进程端发送的任何内容。
  2. 它似乎不适用于cmd.exe 中的命令。我尝试在一个 cmd.exe 中运行一个简单的服务器进程,获取它的 PID 并在另一个窗口中运行 taskkill /PID XXXX 它,但 taskkill 拒绝这样做:ERROR: The process with PID XXXX could not be terminated. Reason: This process can only be terminated forcefully (with /F option).

所以我的问题是:如何通知 Windows 中的命令行进程它应该终止而不强制终止它?待终止进程端如何接收并处理此类消息?

【问题讨论】:

标签: windows process taskkill


【解决方案1】:

GenerateConsoleCtrlEvent 向控制台应用程序发出信号,就像用户按下了 Ctrl+C 或 Ctrl+Break 一样。控制台应用程序可以忽略这些信号(使用 SetContolCtrlHandler),但默认情况下,它们只是对自己执行 ExitProcess。

这与用户关闭控制台窗口、注销或关机时 Windows 使用的信号相同。

【讨论】:

  • 您知道如何从 JavaScript (node.js) 等编程语言发送这些信号吗?
  • @HonzaJavorek:对不起,我没有。也许你应该在问题中添加适当的语言标签,让知道的人注意到这个问题。
【解决方案2】:

如果进程有可见窗口,TaskKill 使用PostMessage(hwnd, WM_CLOSE, 0, 0);(基本上与在窗口上按 X 相同)。

如果您知道该应用程序是控制台应用程序,则可以改用GenerateConsoleCtrlEvent

【讨论】:

    猜你喜欢
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多