Как перезагрузить сбойный процесс в Windows - PullRequest
2 голосов
/ 21 марта 2009

Как перезагрузить сбойный процесс в Windows? Конечно, я могу запустить пользовательский процесс мониторинга Win. Но, например, Firefox: он, похоже, не устанавливает такую ​​штуку, но все же может перезапустить себя при сбое.

Ответы [ 4 ]

4 голосов
/ 21 марта 2009

В Vista и выше вы можете использовать RegisterApplicationRestart API для автоматического перезапуска в случае сбоя или зависания.

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

1 голос
/ 21 марта 2009
  • Структурированная обработка исключений (SEH) позволяет вам отслеживать сбои программы и что-то делать, когда это происходит. См .: __ пробовать и __except
    SEH может быть очень опасным и может привести к зависанию вашей программы. Пожалуйста, смотрите эту статью для получения дополнительной информации.

  • Если вы пишете свою программу в качестве службы NT, вы можете установить первое, второе и последующие действия при сбое на «Перезапустить службу».

  • Для Windows 2008 server и Windows Vista и Windows 7 вы можете использовать Win32 API RegisterApplicationRestart

Пожалуйста, смотрите мой ответ здесь для получения дополнительной информации о работе с различными типами сбоев программ.

1 голос
/ 21 марта 2009

Firefox постоянно сохраняет свое состояние на жестком диске, каждый раз, когда вы открываете вкладку, щелкаете ссылку или выполняете какие-либо другие действия. Он также сохраняет флаг, говоря, что он благополучно отключен.

При запуске он считывает все это обратно и может «восстановить» на основе этой информации.

0 голосов
/ 21 марта 2009

Если я правильно помню, Windows реализует, по крайней мере, некоторое подмножество POSIX, и поэтому «должен» иметь сигнальный интерфейс (такие вещи, как SIGKILL, SIGSEGV, SIGQUIT и т. Д.).

Я никогда не делал этого, кроме как на linux, но вы могли бы попытаться установить ловушку неожиданного завершения с помощью signal () (signal.h). При быстром сканировании документов кажется, что при обработке сигнала можно сделать очень мало, возможно, что даже запуск нового процесса находится в списке запрещенных.

Теперь, когда я подумал об этом, я, вероятно, выбрал бы шаблон master / worker, очень простой родительский поток, который ничего не делает, но порождает работника (который выполняет весь пользовательский интерфейс / другие вещи). Если он не установил конкретный бит «Я сейчас умру», но все еще умирает (родительский процесс всегда получает сообщение / уведомление о том, что порожденный процесс умер), мастер запускает рабочего. Основная тема - держать мастера очень простым и трудно умереть из-за собственных ошибок.

...