Usare un timer di sistema come watchdogUse a system timer as a watchdog

Un'applicazione di alto livello può usare un timer di sistema come watchdog per fare in modo che il sistema operativo termini e riavvii l'applicazione se smette di rispondere.A high-level application can use a system timer as a watchdog to cause the OS to terminate and restart that application if it becomes unresponsive. Alla scadenza, il watchdog genera un segnale che l'applicazione non gestisce e ciò a sua volta fa sì che il sistema operativo termini l'applicazione.When the watchdog expires, it raises a signal that the application doesn't handle, which in turn causes the OS to terminate the application. Dopo la terminazione, il sistema operativo riavvia automaticamente l'applicazione.After termination, the OS automatically restarts the application.

Per usare un timer watchdog:To use a watchdog timer:

  • Definire il timerDefine the timer
  • Creare e attivare il timerCreate and arm the timer
  • Reimpostare il timer regolarmente prima della scadenzaReset the timer regularly before it expires

Per definire il timer, creare una struttura itimerspec e impostare l'intervallo e la scadenza iniziale su un valore fisso, ad esempio un secondo.To define the timer, create an itimerspec structure and set the interval and initial expiration to a fixed value, such as one second.

#include <time.h>

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

Impostare un evento di notifica, un segnale e il valore del segnale per il watchdog, chiamare timer_create per crearlo e chiamare timer_settime per attivarlo.Set a notification event, signal, and signal value for the watchdog, call timer_create to create it, and call timer_settime to arm it. In questo esempio, watchdogTimer genera l'evento SIGALRM.In this example, watchdogTimer raises the SIGALRM event. L'applicazione non gestisce l'evento, quindi il sistema operativo termina l'applicazione.The application doesn't handle the event, so the OS terminates the application.

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

In un'altra posizione nel codice dell'applicazione, prevedere la reimpostazione periodica del watchdog.Elsewhere in the application code, reset the watchdog periodically. Una tecnica consiste nell'usare un secondo timer, con un periodo più breve di watchdogInterval, per verificare che l'applicazione funzioni come previsto e, in caso affermativo, reimpostare il timer watchdog.One technique is to use a second timer, which has a period shorter than the watchdogInterval, to verify that the application is operating as expected and, if so, reset the watchdog timer.

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