시스템 타이머를 Watchdog으로 사용
고급 애플리케이션은 시스템 타이머를 watchdog으로 사용하여 OS가 종료되고 응답하지 않는 경우 해당 애플리케이션을 다시 시작할 수 있습니다. Watchdog이 만료되면 애플리케이션이 처리하지 않는다는 신호가 발생하며, 이로 인해 OS가 애플리케이션을 종료합니다. 종료 후 OS는 애플리케이션을 자동으로 다시 시작합니다.
Watchdog 타이머를 사용하려면 다음을 수행합니다.
- 타이머 정의
- 타이머 만들기 및 무장
- 타이머가 만료되기 전에 정기적으로 다시 설정
타이머를 정의하려면 itimerspec 구조를 만들고 간격 및 초기 만료를 1초와 같은 고정 값으로 설정합니다.
#include <time.h>
const struct itimerspec watchdogInterval = { { 1, 0 },{ 1, 0 } };
timer_t watchdogTimer;
watchdog에 대한 알림 이벤트, 신호 및 신호 값을 설정하고, timer_create 호출하여 만들고, timer_settime 호출하여 무장합니다. 이 예제 watchdogTimer
에서는 SIGALRM 이벤트를 발생합니다. 애플리케이션은 이벤트를 처리하지 않으므로 OS는 애플리케이션을 종료합니다.
void SetupWatchdog(void)
{
struct sigevent alarmEvent;
alarmEvent.sigev_notify = SIGEV_SIGNAL;
alarmEvent.sigev_signo = SIGALRM;
alarmEvent.sigev_value.sival_ptr = &watchdogTimer;
int result = timer_create(CLOCK_MONOTONIC, &alarmEvent, &watchdogTimer);
result = timer_settime(watchdogTimer, 0, &watchdogInterval, NULL);
}
애플리케이션 코드의 다른 곳에서는 Watchdog를 주기적으로 다시 설정합니다. 한 가지 기술은 보다 짧은 watchdogInterval
기간이 있는 두 번째 타이머를 사용하여 애플리케이션이 예상대로 작동하는지 확인하고, 그렇다면 watchdog 타이머를 다시 설정하는 것입니다.
// Must be called periodically
void ExtendWatchdogExpiry(void)
{
//check that application is operating normally
//if so, reset the watchdog
timer_settime(watchdogTimer, 0, &watchdogInterval, NULL);
}