在 Windows 上优雅地终止命令行应用程序
Gracefully terminate a command line application on Windows
我正在创建一个命令行应用程序,它生成一个进程(由用户定义的命令,通常是 HTTP 服务器),当应用程序的工作完成时,我想让该进程知道它应该终止。
在 UNIX 中,我可以通过发送 SIGTERM 来完成,如果进程没有结束,那么我可以通过 SIGKILL 残酷地杀死它。
在 Windows 中,我努力寻找 SIGTERM 场景的替代方案。我了解到有 taskkill /PID XXXX
(没有 /f
!),但是
- 我没有找到关于
taskkill /PID XXXX
幕后功能的信息,因此我无法对其进行测试。我找不到如何处理 taskkill /PID XXXX
在进程端发送的任何内容。
- 它似乎不适用于
cmd.exe
中的命令。我试图 运行 一个简单的服务器进程在一个 cmd.exe
中获取它的 PID 并在另一个 window 中 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 中的命令行进程它应该终止而不是强制终止它?待终止进程端如何接收并处理该消息?
GenerateConsoleCtrlEvent signals a console application as if the user had pressed Ctrl+C or Ctrl+Break. Console applications can ignore these signals (using SetContolCtrlHandler),但是,默认情况下,他们只是对自己执行 ExitProcess。
这与用户关闭控制台 window、注销或关机时使用的信号 Windows 相同。
TaskKill 使用 PostMessage(hwnd, WM_CLOSE, 0, 0);
(基本上与按 window 上的 X 相同)如果进程有一个可见的 window.
如果您知道该应用程序是控制台应用程序,则可以改用 GenerateConsoleCtrlEvent
。
我正在创建一个命令行应用程序,它生成一个进程(由用户定义的命令,通常是 HTTP 服务器),当应用程序的工作完成时,我想让该进程知道它应该终止。
在 UNIX 中,我可以通过发送 SIGTERM 来完成,如果进程没有结束,那么我可以通过 SIGKILL 残酷地杀死它。
在 Windows 中,我努力寻找 SIGTERM 场景的替代方案。我了解到有 taskkill /PID XXXX
(没有 /f
!),但是
- 我没有找到关于
taskkill /PID XXXX
幕后功能的信息,因此我无法对其进行测试。我找不到如何处理taskkill /PID XXXX
在进程端发送的任何内容。 - 它似乎不适用于
cmd.exe
中的命令。我试图 运行 一个简单的服务器进程在一个cmd.exe
中获取它的 PID 并在另一个 window 中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 中的命令行进程它应该终止而不是强制终止它?待终止进程端如何接收并处理该消息?
GenerateConsoleCtrlEvent signals a console application as if the user had pressed Ctrl+C or Ctrl+Break. Console applications can ignore these signals (using SetContolCtrlHandler),但是,默认情况下,他们只是对自己执行 ExitProcess。
这与用户关闭控制台 window、注销或关机时使用的信号 Windows 相同。
TaskKill 使用 PostMessage(hwnd, WM_CLOSE, 0, 0);
(基本上与按 window 上的 X 相同)如果进程有一个可见的 window.
如果您知道该应用程序是控制台应用程序,则可以改用 GenerateConsoleCtrlEvent
。