Изящно завершить приложение командной строки в Windows

Я создаю приложение командной строки, которое порождает процесс (команду, определенную пользователем, обычно HTTP-сервером), и когда работа приложения будет выполнена, я хочу, чтобы процесс знал, что он должен завершиться.

В 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, что он должен завершиться без принудительного завершения? Как получить и действовать в соответствии с таким сообщением на стороне, подлежащей прекращению?

2 ответа

Решение

GenerateConsoleCtrlEvent сигнализирует о консольном приложении, как если бы пользователь нажал Ctrl+C или Ctrl+Break. Консольные приложения могут игнорировать эти сигналы (используя SetContolCtrlHandler), но по умолчанию они просто выполняют ExitProcess для себя.

Это тот же сигнал, который Windows использует, когда пользователь закрывает окно консоли, выходит из системы или выключается.

TaskKill использует PostMessage(hwnd, WM_CLOSE, 0, 0); (в основном то же самое, что нажать X на окне), если процесс имеет видимое окно.

Если вы знаете, что это консольное приложение, вы можете использовать GenerateConsoleCtrlEvent вместо.

Другие вопросы по тегам