Dela via


Använda en systemtimer som vakthund

Ett program på hög nivå kan använda en systemtimer som en vakthund för att få operativsystemet att avslutas och starta om programmet om det slutar svara. När vakthunden går ut höjs en signal som programmet inte hanterar, vilket i sin tur gör att operativsystemet avslutar programmet. Efter att programmet avslutats startar operativsystemet automatiskt om programmet.

Så här använder du en vakthundstimer:

  • Definiera timern
  • Skapa och beväpna timern
  • Återställ timern regelbundet innan den går ut

Om du vill definiera timern skapar du en itimerspecstruktur och anger intervallet och utgångsdatumet till ett fast värde, till exempel en sekund.

#include <time.h>

const struct itimerspec watchdogInterval = { { 1, 0 },{ 1, 0 } };
timer_t watchdogTimer;

Ställ in en meddelandehändelse, signal och signalvärde för vakthunden, ring timer_create för att skapa den och ring timer_settime för att beväpna den. I det här exemplet watchdogTimer höjs SIGALRM-händelsen. Programmet hanterar inte händelsen, så operativsystemet avslutar programmet.

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);
}

På andra ställen i programkoden återställer du vakthunden med jämna mellanrum. En teknik är att använda en andra timer, som har en period kortare än watchdogInterval, för att verifiera att programmet fungerar som förväntat och i så fall återställa övervakningstimern.

// Must be called periodically
void ExtendWatchdogExpiry(void)
{
    //check that application is operating normally
    //if so, reset the watchdog
    timer_settime(watchdogTimer, 0, &watchdogInterval, NULL);
}