2017-02-17 228 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代替。

相關問題