2017-02-17 233 views
4

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

在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).

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

回答

3

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

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

+0

你知道我该如何从编程语言(如JavaScript(node.js))发送这些信号? –

+0

@HonzaJavorek:对不起,我没有。也许你应该为这个问题添加一个合适的语言标签,让那些知道这个问题的人知道。 –

3

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

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

相关问题