Есть ли альтернатива posix SIGTERM в Windows? - (нежное убийство для консольного приложения) - PullRequest
6 голосов
/ 05 января 2010

У меня есть консольный демон, который запускается приложением с графическим интерфейсом. Когда приложение с графическим интерфейсом завершается, я бы тоже хотел остановить демона.

Как я могу сделать это аккуратно на окнах?

В Linux я бы просто использовал SIGTERM. Есть ли аналогичный механизм в Windows для консольных приложений?

Для более подробной информации приложение демона написано на python, а графический интерфейс написан на C # и в формах Windows.

Ответы [ 2 ]

1 голос
/ 05 января 2010

Windows не имеет сигналов, как вы думаете.

Существует некоторая инфраструктура для изменения того, как (поддельные) SIGTERM и SIGBREAK обрабатываются консольными приложениями, в основном SetConsoleCtrlHandler и GenerateConsoleCtrlEvent, но оба они используются только в само консольное приложение; не снаружи.

Стоит отметить, что все приложения консоли Windows, когда оно получает SIGTERM, это вызов ExitProcess, ничего особенного. Я не на 100% уверен в том, что называется эквивалентом Python, но любой стандартный вызов exit должен быть эквивалентен.

Я бы предложил написать некоторый код для сигнализации консольного приложения, заставив его вызвать ExitProcess. Если это не вариант, используйте TerminateProcess (эквивалент Process.Kill ), чтобы закрыть консольный процесс извне; попытка «подделать» ExitProcess опасна по причинам, указанным в статье MSDN.

1 голос
/ 05 января 2010

Определить "нежный":)

Я предполагаю, что уже существует механизм связи между демоном и графическим интерфейсом. Просто введите команду "quit" и отправьте ее.

Если вы хотите убить демона, даже если он занят чем-то (или заморожен), используйте TerminateProcess ().

Чтобы получить лучшее из обоих, вы можете отправить «quit», затем подождать некоторое время на дескрипторе процесса (WaitForSingleObject ()). Если процесс-демон не умирает, скажем, в течение 5 секунд, завершите его.

Если основной поток демона склонен к длительным периодам активности, пусть демон запускает фоновый поток, который ничего не делает, но ожидает именованного события. Чтобы сообщить об этом потоке, откройте событие по имени в графическом интерфейсе, а затем поднимите его. Демону решать, что делать при обнаружении события, но по крайней мере это будет контролируемое отключение.

...