Изящно завершить приложение командной строки в Windows
Я создаю приложение командной строки, которое порождает процесс (команду, определенную пользователем, обычно 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, что он должен завершиться без принудительного завершения? Как получить и действовать в соответствии с таким сообщением на стороне, подлежащей прекращению?
2 ответа
GenerateConsoleCtrlEvent сигнализирует о консольном приложении, как если бы пользователь нажал Ctrl+C или Ctrl+Break. Консольные приложения могут игнорировать эти сигналы (используя SetContolCtrlHandler), но по умолчанию они просто выполняют ExitProcess для себя.
Это тот же сигнал, который Windows использует, когда пользователь закрывает окно консоли, выходит из системы или выключается.
TaskKill использует PostMessage(hwnd, WM_CLOSE, 0, 0);
(в основном то же самое, что нажать X на окне), если процесс имеет видимое окно.
Если вы знаете, что это консольное приложение, вы можете использовать GenerateConsoleCtrlEvent
вместо.