在Windows上正常终止命令行应用程序

时间:2017-02-17 16:54:46

标签: windows process taskkill

我正在创建一个命令行应用程序,它产生一个进程(由用户定义的命令,通常是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).
  3. 所以我的问题是:如何通知Windows中的命令行进程它应该终止而不强行终止它?如何在要终止的流程方面接收和处理此类消息?

2 个答案:

答案 0 :(得分:4)

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

如果您知道应用程序是控制台应用程序,则可以使用GenerateConsoleCtrlEvent代替。

答案 1 :(得分:3)

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

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