Существует ли posix SIGTERM альтернатива в Windows? - (Нежное уничтожение для консольного приложения)

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

Как я могу сделать это нежным способом на окнах?

На Linux я просто использовал бы SIGTERM, там подобный механизм на окнах для консольных приложений?

Для обеспечения немного большего количества детали приложение демона записано в Python, и gui записан в формах окон C# &.

6
задан Chris Barlow 13 February 2012 в 16:26
поделиться

2 ответа

[

]Определите "мягкий" :)[

] [

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

] [

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

] [

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

] [

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

].
1
ответ дан 17 December 2019 в 20:32
поделиться

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

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

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

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

.
1
ответ дан 17 December 2019 в 20:32
поделиться