Share via


Een systeemtimer gebruiken als watchdog

Een toepassing op hoog niveau kan een systeemtimer als waakhond gebruiken om ervoor te zorgen dat het besturingssysteem die toepassing beëindigt en opnieuw start als deze niet meer reageert. Wanneer de watchdog verloopt, wordt er een signaal weergegeven dat de toepassing niet verwerkt, waardoor het besturingssysteem de toepassing beëindigt. Na beëindiging start het besturingssysteem de toepassing automatisch opnieuw op.

Een watchdogtimer gebruiken:

  • De timer definiëren
  • De timer maken en in arm zetten
  • Stel de timer regelmatig opnieuw in voordat deze verloopt

Als u de timer wilt definiëren, maakt u een itimerspec-structuur en stelt u het interval en de initiële vervaldatum in op een vaste waarde, zoals één seconde.

#include <time.h>

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

Stel een meldings-, signaal- en signaalwaarde in voor de watchdog, roep timer_create aan om deze te maken en roep timer_settime aan om deze in te schakelen. In dit voorbeeld watchdogTimer wordt de gebeurtenis SIGALRM gegenereerd. De toepassing verwerkt de gebeurtenis niet, dus het besturingssysteem beëindigt de toepassing.

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

Elders in de toepassingscode stelt u de watchdog regelmatig opnieuw in. Een techniek is om een tweede timer te gebruiken, die een periode heeft die korter is dan de watchdogInterval, om te controleren of de toepassing werkt zoals verwacht en, zo ja, de watchdog-timer opnieuw in te stellen.

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