LINUX 看门狗

LINUX 看门狗,第1张

概述LINUX 看门狗 先要编写看门狗程序program.sh,内容如:
#!/bin/bash

#注:本脚本需要以超级用户身份运行。

# 监测的时间间隔,秒计
INTERVAL=60

# 重启时间间隔
INTERVALRESTART=1

#==================================================================

PROGRAME=program
THREADNUMS=1
LOG=/apps/server/monitor.log
#SYSDATE=$(date)
   
SYSBUILD=`/bin/cat /etc/redhat-release | /bin/awk '{print }'`

var="-emf"
 
case ${SYSBUILD} in
"7.3")
        var="-e"
        ;;
"8.0")
        var="-em"
        ;;
"AS3")
        var="-emf"
        ;;
esac
   
  
while true
do
   SYSDATE=$(date)

  
   Nowps1=`ps $var | grep $PROGRAME | grep -v grep | wc -l`
   Nowps1=`expr $Nowps1`
      
   if [ $Nowps1 -lt $THREADNUMS ]; then
        /bin/sh /apps/program.sh
        echo " " >> $LOG
        echo "*******************************************************" >> $LOG
        echo "Restart time:" $SYSDATE >> $LOG
        echo "---------- Program $PROGRAME restart ----------------" >> $LOG
        echo "*******************************************************" >> $LOG
        echo " "
   fi
sleep $INTERVAL
   
done

#-----------------------------------------------------------
exit 0

在文件/etc/rc.local在其中增加一个启动项,即在文件末尾增加一条可执行语句(如:/bin/sh /apps/program.sh)
看门狗制作完毕。




看门狗在嵌入式系统开发中占据重要的地位,管理系统的工作状态。在这里本人muge0913在参考别人的基础上,实现了mini6410看门狗的移植。

在mini6410中看门狗驱动文件为linux2.6.38/drivers/watchdog/s3c2410_wdt.c
在mini6410中linux系统默认看门狗是不开机启动,但是我们可以向/dev/watchdog写入数据来启动或关闭看门狗。

如:echo 0 >/dev/watchdog

   echo这个命令启动的作用是先打开文件,再写入内容,然后关闭。也就是open->write->release。

 

一段时间后系统会自动重启。

如果执行:

  echo 0 >/dev/watchdog

  echo V >/dev/watchdog

系统侧不会重启。

原因分析:

open函数:

static int s3c2410wdt_open(struct inode *inode, struct file *file)
{
        if (test_and_set_bit(0, &open_lock))
                return -EBUSY;

        if (Nowayout)
                __module_get(THIS_MODulE);

        expect_close = 0;

        /* start the timer */
        s3c2410wdt_start();
        return nonseekable_open(inode, file);
}

release函数:
static int s3c2410wdt_release(struct inode *inode, struct file *file)
{
        /*
         * Shut off the timer.
         * Lock it in if it's a module and we set Nowayout
         */

        if (expect_close == 42)
                s3c2410wdt_stop();
        else {
                dev_err(wdt_dev, "Unexpected close, not stopPing watchdogn");
                s3c2410wdt_keepalive();
        }
        expect_close = 0;
        clear_bit(0, &open_lock);
        return 0;
}

write函数:
static ssize_t s3c2410wdt_write(struct file *file, const char __user *data,
                                size_t len, loff_t *ppos)
{
        /*
         * Refresh the timer.
         */
        if (len) {
                if (!Nowayout) {
                        size_t i;

                        /* In case it was set long ago */
                        expect_close = 0;

                        for (i = 0; i != len; i++) {
                                char c;

                                if (get_user(c, data + i))
                                        return -EFAulT;
                                if (c == 'V')
                                        expect_close = 42;
                        }
                }
                s3c2410wdt_keepalive();
        }
        return len;
}

  看门狗只能被一个进程打开,打开函数中先判断了一下,然后启动了看门狗;再看write函数,写入的如果是V则允许关闭看门狗,如果不是V仅仅喂狗一次;最后是release函数,如果允许关闭则关闭看门狗,如果不允许关闭,打印"Unexpectedclose, not stopPingwatchdog",喂狗一次。此时看门狗并没有关闭,所以系统会复位的,如果输入V则看门狗被关闭,这样系统就不复位了。

看门狗在mini6410上的移植过程:
首先配置:make menuconfig

在drivers/watchdog/s3c2410_wdt.c中进行修改:

#define CONfig_S3C2410_WATCHDOG_ATBOOT (1)
#define CONfig_S3C2410_WATCHDOG_DEFAulT_TIME (15)

注:

#define CONfig_S3C2410_WATCHDOG_ATBOOT (0)//系统启动时不开启看门狗
#define CONfig_S3C2410_WATCHDOG_DEFAulT_TIME (15)//复位时间

   设置成系统启动就启动看门狗,并且看门狗到期时间为15s。这样系统复位后每15s系统就会复位一次,所以我们在用户空间进行喂狗,驱动中的那个中断函数是当看门狗作为定时器时用的,所以没有实现喂狗,所以只能在用户程序中喂狗,下面是源码:

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <linux/watchdog.h>
  
int main(int argc, char **argv){
    int fd;
    fd = open("/dev/watchdog",O_RDONLY);
    if(fd < 0){
        perror("/dev/watchdog");
        return -1;
    }
    for(;;){
        ioctl(fd, WdioC_KEEPAliVE);
        sleep(3);
    }
    close(fd);
    return 0;
}

编译:
arm-linux-gcc wdt.c -o wdt

   把wdt拷贝到root-2.6.30.4/sbin/下,并修改root-2.6.38/etc/init.d/rcS文件,添加wdt&这么一句,让系统启动后这个应用程序在后台运行。

#! /bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel

#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
/bin/hostname FrIEndlyARM

[ -e /proc/1 ] || /bin/mount -n -t proc none /proc
[ -e /sys/class ] || /bin/mount -n -t sysfs none /sys
[ -e /dev/tty ] || /bin/mount -t ramfs none /dev
/bin/mount -n -t usbfs none /proc/bus/usb

echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
/bin/hotplug
# mounting file system specifIEd in /etc/fstab
mkdir -p /dev/pts
mkdir -p /dev/shm
/bin/mount -n -t devpts none /dev/pts -o mode=0622
/bin/mount -n -t tmpfs tmpfs /dev/shm
/bin/mount -n -t ramfs none /tmp
/bin/mount -n -t ramfs none /var
mkdir -p /var/empty
mkdir -p /var/log
mkdir -p /var/lock
mkdir -p /var/run
mkdir -p /var/tmp

/sbin/hwclock -s

syslogd
/etc/rc.d/init.d/netd start
echo " " > /dev/tty1
echo "Starting networking..." > /dev/tty1
sleep 1
/etc/rc.d/init.d/httpd start
echo " " > /dev/tty1
echo "Starting web server..." > /dev/tty1
sleep 1
/etc/rc.d/init.d/leds start
echo " " > /dev/tty1
echo "Starting leds service..." > /dev/tty1
echo " "
sleep 1

echo " " > /dev/tty1
/etc/rc.d/init.d/alsaconf start
echo "Loading sound card config..." > /dev/tty1
echo " "

/sbin/ifconfig lo 127.0.0.1
/etc/init.d/ifconfig-eth0

/sbin/wdt&

/bin/qtopia &
echo " " > /dev/tty1
echo "Starting Qtopia, please waiting..." > /dev/tty1




http://www.linuxso.com/linuxbiancheng/12702.html



某CSDN帖子
/dev/watchdog是一个字符设备节点,简单点可以理解为linux下的一个文件,在程序中使用看门狗的过程大致分为以下几步:
1.打开年看门狗“文件”;
2.设置超时时间;
3,周期性向这个文件写入字符(喂狗);
若程序出现异常退出,无法在喂狗周期内写入字符,则系统将自动复位重启。我写的一个例子代码如下:
C/C++ code

#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/watchdog.h>
#define WDT "/dev/watchdog"
int main()
{
    int wdt_fd = -1;//看门狗文件标识
    int timeout = 10;//超时时间为10s

    wdt_fd = open(WDT,O_WRONLY);
    if(wdt_fd == -1)
    {
        printf("----------Fail to open "WDT"!n");
    }

    ioctl(wdt_fd,WdioC_SETTIMEOUT,&timeout);
    ioctl(wdt_fd,WdioC_GETTIMEOUT,&timeout);
    while(1)
    {
        write(wdt_fd," ",1);
        printf("feet dog***********n");
        sleep(9);
    }
    return 0;
}





转自 http://www.blogjava.net/xixuui/archive/2007/06/27/126545.html
转自 http://blog.csdn.net/zhiweiyouzhishenghuo/article/details/7744155 总结

以上是内存溢出为你收集整理的LINUX 看门狗全部内容,希望文章能够帮你解决LINUX 看门狗所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1013107.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存