• 添加看门狗程序


    在嵌入式系统中,为了防止主应用程序因为不明的原因无故死掉或者程序跑飞,需要加入一个看门狗程序保证系统能够重启(reboot)。

      1 //Linux watch dog test
      2 
      3 
      4 //http://www.cnblogs.com/zengjfgit/p/5396041.html
      5 
      6 /***********************************************************************
      7  *                  Linux Watchdog Test Program
      8  * 说明:
      9  *     由于之前的reset一直没有得到解决,所以这个Watchdog功能一直没有处理,
     10  * 现在问题解决了,于是需要加入这个测试程序。
     11  *
     12  **********************************************************************/
     13 
     14 #include <stdio.h>
     15 #include <stdlib.h>
     16 #include <string.h>
     17 #include <unistd.h>
     18 #include <fcntl.h>
     19 #include <sys/ioctl.h>
     20 #include <linux/types.h>
     21 #include <linux/watchdog.h>
     22 
     23 #define  ZERO 0
     24 #define  SUCCESS 0
     25 #define  FAIL   1
     26 
     27 #define     DDBUG                                 1
     28 #undef      DDBUG
     29 #if DDBUG
     30     #define DEBUG_PRINT(fmt, args...) fprintf(stdout, fmt, ##args)
     31 #else
     32     #define DEBUG_PRINT(fmt, args...)
     33 #endif
     34 
     35 
     36 // watchdog 只要一直打开设备节点不喂,然后等待设定的时间结束引发reset。
     37 int main(void)
     38 {
     39 
     40     int fd_watchdog;
     41     fd_watchdog = open("/dev/watchdog", O_WRONLY); //open device
     42     if (fd_watchdog == -1) {
     43         fprintf(stderr, "Watchdog device not enabled.
    ");
     44         fflush(stderr);
     45         exit(-1);
     46     }
     47 
     48     int timeout = 60;  //60seconds
     49     const int wdt_enable = WDIOS_ENABLECARD;
     50     ioctl(fd_watchdog, WDIOC_SETOPTIONS, (void*)&wdt_enable);  //open watchdog   
     51     ioctl(fd_watchdog, WDIOC_SETTIMEOUT, &timeout);
     52     DEBUG_PRINT("The timeout was set to %d seconds
    ", timeout);
     53     
     54 
     55 
     56     while(1){
     57         
     58         {
     59             ioctl(fd_watchdog, WDIOC_GETTIMEOUT, &timeout);
     60             printf("The timeout was is %d seconds.
    ", timeout);
     61         }
     62         
     63         int timeleft = timeout - 10;
     64         //while((timeleft--) >= 0) {
     65         //    //DEBUG_PRINT("The timeout left %d seconds
    ", timeleft);
     66         //    sleep(1);
     67         //}
     68         
     69         mysleep(timeleft);
     70         
     71         if( SUCCESS == checkProcessExist("miniTerminal")) // Only when miniTerminal is running, will we feed the watchdog
     72         {     
     73             ////feed the watchdog
     74             if(fd_watchdog >= 0) {
     75                 feeddog(fd_watchdog);
     76             }
     77         }
     78         
     79         sleep(10);
     80     }
     81 }
     82 
     83 void mysleep(int timelength){
     84     while((timelength--) >= 0) {
     85         //DEBUG_PRINT("The timeout left %d seconds
    ", timeleft);
     86         sleep(1);
     87     }
     88     
     89     return;
     90 }
     91 
     92 
     93 void feeddog(int fd_watchdog)
     94 {
     95     //ioctl(fd_watchdog, WDIOC_KEEPALIVE, 0);
     96     static unsigned char food = 0;
     97     ssize_t eaten = write(fd_watchdog, &food, 1);
     98     if(eaten != 1) {
     99         DEBUG_PRINT("
    !!! FAILED feeding watchdog
    ");
    100         //syslog(LOG_WARNING, "FAILED feeding watchdog");
    101     }  
    102 
    103      fsync(fd_watchdog);  // if you don't fsync fd_watchdog, then the write won't function normally.
    104      return;
    105 }
    106 
    107 int checkProcessExist(char *name)
    108 {
    109     //char *Name = "miniTerminal";
    110     FILE *pstr;
    111     char cmd[100];
    112     char number[10];
    113     
    114     int ret = SUCCESS;
    115     
    116     memset(cmd, 0 , sizeof(cmd));
    117     sprintf(cmd,"ps | grep %s | grep -v grep | wc -l",name);
    118     pstr=popen(cmd,"r");
    119 
    120     fgets(number,9, pstr);
    121     DEBUG_PRINT("number is %d
    ",atoi(number));
    122     
    123     if( ZERO == atoi(number))
    124     {
    125         DEBUG_PRINT("process - %s not exist!
    ",name);
    126         ret = FAIL;
    127     }
    128     else
    129     {
    130         DEBUG_PRINT("process - %s exist!
    ",name);
    131         ret = SUCCESS;
    132     }
    133     
    134     pclose(pstr);
    135     return ret;
    136     
    137 }

    设置看门狗的超时时间为80秒,如果在80秒以内检测到程序存在,则喂狗;否则,不喂狗,等待系统reboot。测试,OK。

  • 相关阅读:
    生产者与消费者
    .net 重新注册
    linux 网络之 bond 网卡模式
    Rancher
    kubernetes 集群
    centos7 网卡命名
    Redis 主从模式
    Redis 集群
    Redis
    TwemProxy Redis架构
  • 原文地址:https://www.cnblogs.com/xuanyuanchen/p/5690526.html
Copyright © 2020-2023  润新知