システム タイマーをウォッチドッグとして使用する
高レベルのアプリケーションでは、システム タイマーをウォッチドッグとして使用して、OS が応答しなくなった場合にそのアプリケーションを終了して再起動させることができます。 ウォッチドッグの有効期限が切れると、アプリケーションが処理しないことを通知します。これにより、OS によってアプリケーションが終了します。 終了後、OS はアプリケーションを自動的に再起動します。
ウォッチドッグ タイマーを使用するには:
- タイマーを定義する
- タイマーを作成してアームする
- タイマーの有効期限が切れる前に定期的にリセットする
タイマーを定義するには、 itimerspec 構造体を作成し、間隔と初期有効期限を固定値 (1 秒など) に設定します。
#include <time.h>
const struct itimerspec watchdogInterval = { { 1, 0 },{ 1, 0 } };
timer_t watchdogTimer;
ウォッチドッグの通知イベント、シグナル、シグナル値を設定し、 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);
}
アプリケーション コードの他の場所で、ウォッチドッグを定期的にリセットします。 1 つの手法は、2 番目のタイマーを使用して、 よりも watchdogInterval
短い期間を持ち、アプリケーションが想定どおりに動作していることを確認し、その場合はウォッチドッグ タイマーをリセットすることです。
// Must be called periodically
void ExtendWatchdogExpiry(void)
{
//check that application is operating normally
//if so, reset the watchdog
timer_settime(watchdogTimer, 0, &watchdogInterval, NULL);
}