我正在创build一个命令行应用程序,它产生一个进程(用户定义的命令,通常是一个HTTP服务器),当应用程序的任务完成时,我想让进程知道它应该终止。
在UNIX中,我可以通过发送SIGTERM来完成,如果进程没有结束,那么我可以通过SIGKILL残酷地杀死它。
在Windows中,我很难findSIGTERM场景的替代scheme。 我学到了taskkill /PID XXXX
(没有/f
!),但是
taskkill /PID XXXX
没有任何信息,因此我无法testing它。 我找不到如何处理任何taskkill /PID XXXX
在进程端发送。 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
。