我正在创建一个命令行应用程序,它产生一个进程(由用户定义的命令,通常是HTTP服务器),当应用程序的工作完成时,我想让进程知道它应该终止。
在UNIX中,我可以通过发送SIGTERM来做到这一点,如果进程没有结束,那么我可以通过SIGKILL残忍地杀死它。
在Windows中,我很难找到SIGTERM场景的替代方案。我在那里学到了taskkill /PID XXXX
(没有/f
!),但是
taskkill /PID XXXX
在幕后做什么的信息,因此我无法测试它。我无法找到如何处理进程端的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).
所以我的问题是:如何通知Windows中的命令行进程它应该终止而不强行终止它?如何在要终止的流程方面接收和处理此类消息?
答案 0 :(得分:4)
如果进程有可见窗口,TaskKill使用PostMessage(hwnd, WM_CLOSE, 0, 0);
(基本上与在窗口上按X相同)。
如果您知道应用程序是控制台应用程序,则可以使用GenerateConsoleCtrlEvent
代替。
答案 1 :(得分:3)
GenerateConsoleCtrlEvent表示控制台应用程序,就像用户按下Ctrl + C或Ctrl + Break一样。控制台应用程序可以忽略这些信号(使用SetContolCtrlHandler),但默认情况下,它们只对自己执行ExitProcess。
这与Windows在用户关闭控制台窗口,注销或关闭时使用的信号相同。