#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <linux/watchdog.h>
#define WATCHDOG_IOCTL_BASE 'W'
#define WDIOC_SETTIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 6, int)
#define WATCHDOG_IOCTL_BASE 'W'
#define WDIOC_KEEPALIVE _IOR(WATCHDOG_IOCTL_BASE, 5, int)
void sigroutine(int signo){
switch (signo){
case SIGALRM:
{
printf("Catch a signal -- SIGALRM /n");
ioctl(wdt_fd, WDIOC_KEEPALIVE, 0);
signal(SIGALRM, sigroutine);
}
break;
case SIGVTALRM:
printf("Catch a signal -- SIGVTALRM /n");
signal(SIGVTALRM, sigroutine);
break;
}
return;
}
int main(void)
{
struct itimerval value,ovalue;
//open wtd
wdt_fd = open("/dev/watchdog", O_WRONLY);
if (wdt_fd == -1)
{
printf("open wtd fail\n");
}
//set timeout value
int timeout = 3;
ioctl(wdt_fd, WDIOC_SETTIMEOUT, &timeout);
//define signal action
signal(SIGALRM, sigroutine);
//set timeer to feed dog
value.it_value.tv_sec = 1;
value.it_value.tv_usec = 0;
value.it_interval.tv_sec = 1;
value.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &value, &ovalue);
while(1);
//close wtd
int option = WDIOS_DISABLECARD;
ioctl(wdt_fd, WDIOC_SETOPTIONS, &option);
if (wdt_fd != -1)
{
close(wdt_fd);
wdt_fd = -1;
}
return 1;
}