Share via


システム タイマーをウォッチドッグとして使用する

高レベルのアプリケーションでは、システム タイマーをウォッチドッグとして使用して、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);
}