关于看门狗应用的分析及拓展

以下为看门狗测试应用的代码

/*
* Watchdog Driver Test Program
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/watchdog.h>//头文件包含
int fd;//定义变量。
/*
* This function simply sends an IOCTL to the driver, which in turn ticks
* the PC Watchdog card to reset its internal timer so it doesn't trigger
* a computer reset.
*/
static void keep_alive(void)//定义一个喂狗程序
{
int dummy;定义内容
ioctl(fd, WDIOC_KEEPALIVE, &dummy);使用ioctl函数实现喂狗
}。
/*


* The main program. Run the program with "-d" to disable the card,
* or "-e" to enable the card.
*/
int main(int argc, char *argv[])定义主函数,argc为传入参数的个数,argv数组为传入的内容,argv【1】为传入的第一个参数,其余的往后排。argv【0】中内容是函数自己的名字,也就是main
{
int flags;//定义一个标志
int timeout=atoi(argv[2]);定义一个timeout变量,并将argv【2】也就是读入的第二个数用atio函数将字符串转换成整型之后赋值给timeout。
fd = open("/dev/watchdog", O_WRONLY);使用open函数打开看门狗节点,此时看门狗开启

open函数属于Linux中系统IO,用于“打开”文件,代码打开一个文件意味着获得了这个文件的访问句柄。
int fd = open(参数1,参数2,参数3);
int fd = open(const char *pathname,int flags,mode_t mode)
句柄(file descriptor 简称fd)
首先每个文件都属于自己的句柄,例如标准输入是0,标准输出是1,标准出错是2。
每打开一个文件就会返回句柄来操作这个文件,一般是从3开始,然后4,5,6下去。
close(fd)之后句柄就返回给系统,例如打开一个文件后fd是3,close之后再打开另外一个文件也还是3,但代表的文件不一样了。
参数1(pathname)
即将要打开的文件路径,例如:“/dev/watchdog”
参数2(flags)
flags分为两类:主类,副类
主类:
O_RDONLY 以只读方式打开
O_WRONLY 以只写方式打开
O_RDWR 以可读可写方式打开
三者是互斥的

副类:
O_CREAT 如果文件不存在则创建该文件
O_EXCL 如果使用O_CREAT选项且文件存在,则返回错误消息
O_NOCTTY 如果文件为终端,那么终端不可以调用open系统调用的那个进程的控制终端
O_TRUNC 如果文件已经存在泽删除文件中原有数据
O_APPEND 以追加的方式打开
主副可以配合使用,例如:O_RDWR|O_CREAT|O_TRUNC

参数3(mode)
mode:如果文件被新建,指定其权限未mode
mode是八进制权限码,0777表示文件所有者 该文件用户组 其他用户都有可读可写可执行权限
int open( const char * pathname,int flags);
int open( const char * pathname,int flags,mode_t mode);
但open函数有两个定义,目前还不清楚区别。但代码中只是用了两个参数。

if (fd == -1) {如果open的返回值是-1
fprintf(stderr, "Watchdog device not enabled.\n");fprintf格式化输出到一个流文件,stderr对应的是linux的终端。
fflush(stderr);fflush刷新缓冲区
exit(-1);退出
}
if (argc > 1)如果argc大于1,也就是说除了函数名本身,有参数输入
{
if (!strncasecmp(argv[1], "-d", 2)) {对比字符串,strncasecmp为对比字符串的函数,最后一个是要对比的数量,前边是内容。作用是检查输入的第一个参数是不是-d。
flags = WDIOS_DISABLECARD;关闭看门狗
在内核include/uapi/linux/watchdog.h文件中有相关定义。


ioctl(fd, WDIOC_SETOPTIONS, &flags);写入关闭看门狗
Ioctl函数,简单理解就是给一个位置写入内容。具体的很复杂,参考https://blog.csdn.net/coolwriter/article/details/78242256
fprintf(stderr, "Watchdog card disabled.\n");
fflush(stderr);
exit(0);/同样的,打印刷新,退出
}
else if (!strncasecmp(argv[1], "-e", 2)) {
flags = WDIOS_ENABLECARD;检测参数-e,和-d相反是给看门狗一个使能信息。
ioctl(fd, WDIOC_SETOPTIONS, &flags);
fprintf(stderr, "Watchdog card enabled.\n");
fflush(stderr);
exit(0);
}
else if (!strncasecmp(argv[1], "-t", 2))这部分是我后来添加的,检测-t参数
{
if(timeout<=120&&timeout>=0)判断输入的值,我这里设置最大输入120s
{
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);将设置的值写入WDIOC_SETTIMEOUT这个宏中,宏也是在watchdog.h中定义。
fprintf(stderr, "Watchdog timeout value set success!\n");
fprintf(stderr, "watchout timeout value is %d" ,timeout);
fflush(stderr);打印提示内容
exit(0);
}
else
{
fprintf(stderr, "Please input a correct value(0-120)!\n");
fflush(stderr);
exit(0);如果没在设定范围,提示输入正确的值
}
}
else {
fprintf(stderr, "-d to disable, -e to enable,-t to set timeout.\n");
fprintf(stderr, "run by itself to tick the card.\n");
fflush(stderr);
exit(0);如果输入的第一个参数不对,打印提示信息。
}
}
else {如果没有输入参数,打印信息并进入喂狗循环
fprintf(stderr, "Watchdog Ticking Away!\n");
fflush(stderr);
}
while(1) {
keep_alive();
sleep(1);隔一秒进行一次喂狗
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值