在Windows上完美地终止命令行应用程序

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

在UNIX中,我可以通过发送SIGTERM来完成,如果进程没有结束,那么我可以通过SIGKILL残酷地杀死它。

在Windows中,我很难findSIGTERM场景的替代scheme。 我学到了taskkill /PID XXXX (没有/f !),但是

  1. 我发现任何taskkill /PID XXXX没有任何信息,因此我无法testing它。 我找不到如何处理任何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). ERROR: The process with PID XXXX could not be terminated. Reason: This process can only be terminated forcefully (with /F option).

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

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

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

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

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