Watchdog встроен в тот же процесс, что и программа, которой он управляет
Я запускаю консольную тестовую программу Visual C++ внутри ежедневной сборки. Время от времени тест вызывал какую-то функцию, которая была ненадлежащим образом изменена другими разработчиками, спускался в бесконечный цикл и зависал, блокируя сборку.
Мне нужно сторожевое решение как можно проще. Вот что я придумал. В точке входа в тестовую программу я запускаю отдельный поток, который непрерывно зацикливается и проверяет истекшее время. Если какой-то заранее определенный период превышен, он вызывает TerminateProcess(). псевдокод:
DWORD WatchDog( LPVOID)
{
DWORD start = GetTickCount();
while( true ) {
Sleep( ReasonablePeriod );
if( GetTickCount() - start > MaxAllowed ) {
TerminateProcess( GetCurrentProcess(), 0 );
}
}
return 0;
}
Является ли это решение хуже, чем сторожевой таймер, реализованный в виде отдельной мастер-программы?
1 ответ
Я думаю, что предпочтительнее реализовать сторожевой таймер как отдельный процесс. Его проще использовать повторно, легче определить, произошло ли сбой вашего приложения, и получить код возврата.