Partilhar via


Utilizar um temporizador do sistema como um cão de guarda

Uma aplicação de alto nível pode utilizar um temporizador de sistema como um watchdog para fazer com que o SO termine e reinicie essa aplicação se deixar de responder. Quando o watchdog expira, gera um sinal de que a aplicação não processa, o que, por sua vez, faz com que o SO termine a aplicação. Após a terminação, o SO reinicia automaticamente a aplicação.

Para utilizar um temporizador de cão de guarda:

  • Definir o temporizador
  • Criar e armar o temporizador
  • Repor o temporizador regularmente antes de expirar

Para definir o temporizador, crie uma estrutura itimerspec e defina o intervalo e a expiração inicial para um valor fixo, como um segundo.

#include <time.h>

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

Defina um evento de notificação, sinal e valor de sinal para o cão de guarda, chame timer_create para criá-lo e chame timer_settime para armá-lo. Neste exemplo, watchdogTimer gera o evento SIGALRM. A aplicação não processa o evento, pelo que o SO termina a aplicação.

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

Noutros locais do código da aplicação, reponha o cão de guarda periodicamente. Uma técnica consiste em utilizar um segundo temporizador, que tem um período mais curto do que o watchdogInterval, para verificar se a aplicação está a funcionar conforme esperado e, em caso afirmativo, repor o temporizador do watchdog.

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