Linux下看门狗测试,监控系统稳定性。 (linux 看门狗测试)

Linux下看门狗测试,监控系统稳定性

随着计算机应用的不断扩展和发展,系统的稳定性问题越来越受到关注。为了保证系统的稳定性和可靠性,各种监控手段被广泛应用于计算机系统中。与此同时,看门狗(Watchdog)也逐渐成为一种重要的监控手段。本文将介绍在Linux下进行看门狗测试的方法,并且探讨如何通过使用看门狗来监控系统的稳定性。

一、看门狗的作用

看门狗是一种硬件或软件工具,旨在监控系统的运行状态。看门狗会周期性地向系统发送信号,以确保系统处于正常运行状态。如果系统出现异常或崩溃,看门狗会自动重启系统,从而达到保证系统稳定性的目的。由于看门狗是自动化运行的,所以可以显著提高系统的稳定性和可靠性。

二、Linux下的看门狗

在Linux系统下,看门狗通常是通过硬件实现的。一般来说,看门狗会连接到系统的PCI总线上,然后由BIOS启动看门狗。在Linux内核中,看门狗设备通常被称为 /dev/watchdog。通过读取 /dev/watchdog 设备信息,就可以了解系统是否处于正常运行状态。如果获取 /dev/watchdog 设备信息失败,那么就表明系统出现故障,需要重启。

三、如何配置看门狗

我们可以使用系统自带的watchdog工具来配置和监控系统的看门狗。watchdog工具的安装方法依赖于您的Linux发行版,比较常见的发行版如Ubuntu、CentOS和Debian等都有watchdog工具包。在完成安装后,可以运行以下命令来检查是否已经安装成功:

“`

# watchdog –version

“`

如果输出版本号,那么就表明watchdog已经安装成功了。

接下来,需要编辑watchdog的配置文件 /etc/watchdog.conf。在配置文件中,可以设置watchdog的各种参数,包括监控时间、重启时间等。通过修改这些参数,可以使watchdog更好地适应不同的系统。另外还需要注意的是,如果watchdog检测到系统出现故障,它将在一定时间范围内发送警告信息。如果在这个时间范围内没有采取任何措施,watchdog会自动重启系统。因此,在配置watchdog时,必须确保接收警告信息的程序能够及时响应并采取相应措施。

四、测试看门狗

为了确保看门狗能够正确地监控系统的稳定性,我们需要进行一些测试。在Linux系统下,通常有两种测试方式:

1. 模拟系统故障。

在这种测试中,我们可以手动模拟系统出现故障,从而观察看门狗的运行情况。例如,我们可以将系统中的某个重要进程杀死,然后观察看门狗是否能够启动并重启系统。

2. 禁用网络连接。

在这种测试中,我们可以禁用系统的网络连接,从而观察看门狗是否能够检测到这种变化。具体来说,可以使用以下命令关闭网络连接:

“`

# systemctl stop network-manager

“`

停止网络连接后,等待一段时间观察看门狗的运行情况。

五、

在本文中,我们介绍了Linux下看门狗测试的方法,并探讨了如何使用看门狗来监控系统的稳定性。通过使用看门狗,我们可以保证系统的稳定性和可靠性。如果您是一名系统管理员或开发人员,希望可以通过本文的介绍,更好地了解Linux下的看门狗,并加强您的系统监控工作。

相关问题拓展阅读:

【求助】linux下的C语言多线程,怎样监视键盘上的输入?

发所用语言为C..

一般的..要想学好嵌入式开发..就要两个都会..

如果只学linux,这个只是为以后从事linux服务器搭建,管理和维护等..差不多就是跟硬件打交道..

而嵌入式开发就相当于..在windows下用C,C++,C#,java等开发一样..只不过他的开发平台换成了linux…

如果想自学建议按照以下步骤:

学习步骤如下:

1、Linux 基础

安装Linux操作系统

Linux文件系统

Linux常用命令

Linux启动过程详解

熟悉Linux服务能够独立安装Linux操作系统

能够熟练使用Linux系统的基本命令

认识Linux系统的常用服务安装Linux操作系统

Linux基本命令实践

设置Linux环境变量

定制Linux的服务 Shell 编程基础使用vi编辑文件

使用Emacs编辑文件

使用其他编辑器

2、Shell 编程基础

Shell简介

认识后台程序

Bash编程熟悉Linux系统下的编辑环境

熟悉Linux下的各种Shell

熟练进行shell编程熟悉vi基本操作

熟悉Emacs的基本操作

比较不同shell的区别

编写一个测试服务器是否连通的shell脚本程序

编写一个查看进程是否存在的shell脚本程序

编写一个带有循环语句的shell脚本程序

3、Linux 下的 C 编程基础

linux C语言环境概述

Gcc使用方法

Gdb调试技术

Autoconf

Automake

Makefile

代码优化 熟悉Linux系统下的开发环境

熟悉Gcc编译器

熟悉Makefile规则编写Hello,World程序

使用 make命令编译程序

编写带有一个循环的程序

调试一个有问题的程序

4、嵌入式系统开发基础

嵌入式系统概述

交叉编译

配置TFTP服务

配置NFS服务

下载Bootloader和内核

嵌入式Linux应用软件开发流程

熟悉嵌入式系统概念以及开发流程

建立嵌入式系统开发环境制作cross_gcc工具链

编译并下载U-boot

编译并下载Linux内核

编译并下载Linux应用程序

嵌入式系统移植

Linux内核代码

平台相关代码分析

ARM平台介绍

平台移植的关键技术

移植Linux内核到 ARM平台 了解移植的概念

能够移植Linux内核移植Linux2.6内核到 ARM9开发板

5、嵌入式 Linux 下串口通信

串行I/O的基本概念

嵌入式Linux应用软件开发流程

Linux系统的文件和设备

与文件相关的系统调用

配置超级终端和MiniCOM 能够熟悉进行串口通信

熟悉文件I/O 编写串口通信程序

编写多串口通信程序

6、嵌入式系统中多进程程序设计

Linux系统进程概述

嵌入式系统的进程特点

进程操作

守护进程

相关的系统调用了解Linux系统中进程的概念

能够编写多进程程序编写多进程程序

编写一个守护进程程序

sleep系统调用任务管理、同步与通信 Linux任务概述

任务调度

管道

信号

共享内存

任务管理 API 了解Linux系统任务管理机制

熟悉进程间通信的几种方式

熟悉嵌入式Linux中的任务间同步与通信

编写一个简单的管道程序实现文件传输

编写一个使用共享内存的程序

7、嵌入式系统中多线程程序设计

线程的基础知识

多线程编程方法

线程应用中的同步问题了解线程的概念

能够编写简单的多线程程序编写一个多线程程序

8、嵌入式 Linux 网络编程

网络基础知识

嵌入式Linux中TCP/IP网络结构

socket 编程

常用 API函数

分析Ping命令的实现

基本UDP套接口编程

许可证管理

PPP协议

GPRS 了解嵌入式Linux网络体系结构

能够进行嵌入式Linux环境下的socket 编程

熟悉UDP协议、PPP协议

熟悉GPRS 使用socket 编写代理服务器

使用socket 编写路由器

编写许可证服务器

指出TCP和UDP的优缺点

编写一个web服务器

编写一个运行在 ARM平台的网络播放器

9、GUI 程序开发

GUI基础

嵌入式系统GUI类型

编译QT

进行QT开发熟悉嵌入式系统常用的GUI

能够进行QT编程使用QT编写“Hello,World”程序

调试一个加入信号/槽的实例

通过重载QWidget 类方法处理事件

10、Linux 字符设备驱动程序

设备驱动程序基础知识

Linux系统的模块

字符设备驱动分析

fs_operation结构

加载驱动程序了解设备驱动程序的概念

了解Linux字符设备驱动程序结构

能够编写字符设备驱动程序编写Skull驱动

编写键盘驱动

编写I/O驱动

分析一个看门狗驱动程序

对比Linux2.6内核与2.4内核中字符设备驱动的不同

Linux 块设备驱动程序块设备驱动程序工作原理

典型的块设备驱动程序分析

块设备的读写请求队列了解Linux块设备驱动程序结构

能够编写简单的块设备驱动程序比较字符设备与块设备的异同

编写MMC卡驱动程序

分析一个文件系统

对比Linux2.6内核与2.4内核中块设备驱动的不同

11、文件系统

虚拟文件系统

文件系统的建立

ramfs内存文件系统

proc文件系统

devfs 文件系统

MTD技术简介

MTD块设备初始化

MTD块设备的读写操作了解Linux系统的文件系统

了解嵌入式Linux的文件系统

了解MTD技术

能够编写简单的文件系统为 ARM9开发板添加 MTD支持

移植JFFS2文件系统

通过proc文件系统修改操作系统参数

分析romfs 文件系统源代码

创建一个cramfs 文件系统

望采纳:可是一个字一个字钱敲出来的..

另外,站长团上有产品团购,便宜有保证

在Microsoft Windows 中,键盘和鼠标是两个标准的用户输入源,在一些交叠的操作中通常相互补充使用。当然,鼠标在今天的应用程序中比10年前使用得更为广泛。甚至在一些应用程序中,我们更习惯于使用鼠标,例如在游戏、画图程序、音乐程序,以及Web创览器等程序中就是这样。然而,我们可以不使用鼠标,但绝对不能从一般的PC中拆掉键盘。

  Windows程序获得键盘输入的方式:键盘输入以消息的形式传递给程序的窗口过程。实际上,之一次学习消息时,键盘就是一个明显的例子:消息应该传递给应用程序的信息类型。

  Windows用8种不同的消息来传递不同的键盘事件。这好像太多了,但是(就像我们所看到的一样)程序可以忽略其中至少一半的消息而不会有任何问题。并且,在大多数情况下,这些消息中包含的键盘信息会多于程序所需要的。处理键盘的部分工作就是识别出哪些消息是重要的,哪些是不重要的。

键盘基础知识

  虽然应用程序在很多情况下可以通过鼠标实现信息的输入,但到现在为止键盘仍然是PC机中不可替代的重要输入设备。

  用键盘当作输入设备,每当用户按下或释放某一个键时,会产生一个中断,该中断激活键盘驱动程序KEYBOARD.DRV来对键盘中断进行处理。 KEYBOARD.DRV程序会根据用户的不同操作进行编码,然后调用Windows用户模块USER.EXE生成键盘消息,并将该消息发送到消息队列中等候处理。

1.扫描码和虚拟码

  扫描码对应着键盘上的不同键,每一个键被按下或释放时,都会产生一个唯一的扫描码作为本身的标识。扫描码依赖于具体的硬件设备,即当相同的键被按下或释放时,在不同的机器上可能产生不同的扫描码。在程序中通常使用由Windows系统定义的与具体设备无关的虚拟码。在击键产生扫描码的同时,键盘驱动程序KEYBOARD.DRV截取键的扫描码,然后将其翻译成对应的虚拟码,再将扫描码和虚拟码一齐编码形成键盘消息。所以,最后发送到消息队列的键盘消息中,既包含了扫描码又包含了虚拟码。

  经常使用的虚拟码在WINDOWS.H文件中定义,常用虚拟码的数值、常量符号和含义如表所示。

取值(16进制) 常量符号 含义

VK_LBUTTON 鼠标左键

VK_RBUTTON 鼠标右键

VK_CANCEL Break中断键

VK_MBUTTON 鼠标中键

未定义

VK_BACK (BackSpace)键

VK_TAB Tab键

0A-0B — 未定义

0C VK_CLEAR Clear键

0D VK_RETURN Enter键

0E-0F — 未定义

VK_SHIFT Shift键

VK_CONTROL Ctrl键

VK_MENU Alt键

VK_PAUSE Pause键

VK_CAPTIAL CapsLock键

汉字系统保留

1A — 未定义

1B VK_ESCAPE Esc键

1C-1F — 汉字系统保留

VK_SPACE 空格键

VK_PRIOR PageUp键

VK_NEXT PageDown键

VK_END End键

VK_HOME Home键

VK_LEFT ←(Left Arrow)键

VK_UP ↑(Up Arrow)键

VK_RIGHT →(Right Arrow)键

VK_DOWN ↓(Down Arrow)键

VK_SELECT Select键

2A — OEM保留

2B VK_EXECUTE Execute键

2C VK_SNAPSHOT Print Screen键

2D VK_INSERT Insert键

2E VK_DELETE Delete键

2F VK_HELP Help键

VK_0-VK_9 数字键0-9

3A未定义

A VK_A-VK_Z 字母键A-Z

5B-5F — 未定义

VK_NUMPAD0-VK_NUMPAD9 小键盘数字键0-9

6A VK_MULTIP *(乘号)键

6B VK_ADD +(加号)键

6C VK_SEPAPATOR 分隔符键

6E VK_SURACT -(减号)键

6F VK_DECIMAL .(小数点)键

VK_DIVIDE /(除号)键

F VK_F1-VK_F24 F1-F24功能键

VK_NUMBERLOCK Number lock键

VK_SCROLL Scroll lock键

B9 — 未定义

BA-C0 — OEM保留

C1-DA — 未定义

DB_E4 — OEM保留

E5 — 未定义

E6 — OEM保留

E7-E8 — 未定义

E9-F5 — OEM保留

F6-FE — 未定义

2.输入焦点

  同一时刻,Windows中可能有多个不同的程序在运行,也就是说有多个窗口同时存在。这时,键盘由多个窗口共享,但只有一个窗口能够接收到键盘消息,这个能够接收键盘消息的窗口被称为拥有输入焦点的窗口。

  拥有输入焦点的窗口应该是当前的活动窗口,或者是活动窗口的子窗口,其标题和边框会以高亮度显示,以区别于其他窗口。拥有输入焦点的也可以是图标而不是窗口,此时,Windows也将消息发送给图标,只是消息的格式略有不同。

  窗口过程可以通过发送WM_SETFOCUS和 WM_KILLFOCUS消息使窗体获得或失去输入焦点。程序也可以通过捕获WM_SETFOCUS和WM_KILLFOCUS消息来判断窗体何时获得或失去输入焦点。其中WM_SETFOCUS消息表示窗口正获得输入焦点,WM_ KILLFOCUS消息表示窗口正失去输入焦点。

3.键盘消息

  键盘消息分为系统键消息和非系统键消息。系统键消息是指由Aft键和其他键组合而产生的按键消息。当系统键被按下时产生WM_ SYSKEYDOWN消息,当系统键被释放时产生WM_SYSKEYUP消息。 Aft键与其他键形成的组合键通常用于对程序菜单和系统菜单进行选择,或用于在不同的程序之间进行切换。因此,系统键消息应该交由Windows进行处理,用户所编制的程序一般不处理系统键消息,而是将这些消息交由DefWindowProc函数进行处理。如果用户想对系统键消息进行处理,应该在处理完这些消息后,再将其发送给DefWindowProc函数,使得Windows系统能够正常工作。

  某些击键消息可以被转换成字符消息,例如字母键、数字键等。而有些键只能产生按键消息而没有字符消息,例如 Shift键、Insert键等。消息循环中的 TranslateMessage函数可以实现从击键消息向字符消息的转化。当GetMessage函数捕获一个WM_SYSKEYDOWN消息或 WM_KEYDOWN消息后,TranslateMessage函数判断产生该消息的键是否能够被转换成字符消息,如果能,就将该消息转换成字符消息,再通过DispatchMessape函数将转换后的字符消息发送到消息队列中去。字符消息共有以下四种,如表所示。

字符 系统字符 非系统字符

普通字符 WM_SYSCHAR WM_CHAR

死字符 WM_SYSDEADCHAR WM_DEADCHAR

  其中死字符是由某些特殊键盘上的按键所造成的,Windows一般忽略死字符所产生的消息。

  Windows的消息一般是通过一个MSG结构体变量传送给消息处理函数的。对于键盘消息, MSG结构体变量的各个域中较重要的是lParam域和 wParam域。wParam域用于保存按键的虚拟键代码或字符的ASCII码。对于非字符消息,wParam域保存按键的虚拟健代码;对于字符消息, wParam域不保存字符的ASCII码。lParam域则用于保存击键时产生的附加信息,实际上一个32位的lParam变量被分为六部分,记录了以下相关信息:重复次数、OEM扫描码、扩展键标志、关联键标志、前一击键状态和转换状态。lParam域各位的含义如表所示。

位数 含义

击键重复次数累加

OEM扫描码

是否为扩展键

未定义

是否便用关联键,及Alt键是否同时按下。

前一次击键状态,0表示该键前一次状态为抬起,1表示前一次状态为按下

转换状态

  按键的次序不同,产生的消息也不相同。例如,按下并释放1键,读过程依次产生如表所示三条消息。按下1键所产生的消息和wParam的取值

消息 wParam变量取值

WM_KEYDOWN 虚拟码1

WM_CHAR ASCII码“1”

WM_KEYUP 虚拟码1

  如果按下Shift键后再按下1键并释放,则依次产生如表所示的消息。按下 Shift键后按 1健所产生的消息和 wParam的取值

消息 wParam变量取值

WM_KEYDOWN 虚拟码 VK_SHIFT

WM_KEYDOWN 虚拟码 VK_1

WM_CHAR ASCII码 “1”

WM_KEYUP 虚拟码 VK_1

WM_KEYUP 虚拟码 VK_SHIF

键盘应用实例

  下面通过一个应用程序实例来说明在实际编程中如何处理键盘消息。

#include

#include

// 全局变量

RECT rc; //记录滚屏的矩形区域

?

int xChar, yChar; //文本输入点坐标

WNDCLASSEX wnd; //窗口类结构变量

char szAppName = “键盘消息监视程序”; //窗口类名

//函数声明

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

BOOL MyRegisterClass(HINSTANCE hInstance);

BOOL InitInstance(HINSTANCE hInstance,int iCmdShow);

//函数:WinMain

//作用:入口函数

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)

{

  MSG msg;

  if(!MyRegisterClass(hInstance))

  {

return FALSE;

  }

  

if(!InitInstance(hInstance,iCmdShow))

  {

return FALSE;

  }

  

  while (GetMessage (&msg, NULL, 0, 0))

  {

TranslateMessage (&msg);

DispatchMessage (&msg);

  }

  return msg.wParam;

}

//函数:ShowKey

//作用:实现在窗口中显示按键信息

void ShowKey (HWND hwnd, int iType,char *szMessage,WPARAM wParam,LPARAM lParam)

{

  static char *szFormat ={“%-14s %3d %c %6u %4d %5s %5s %6s %6s”,

      ”%-14s %3d %c %6u %4d %5s %5s %6s %6s” };

  char szBuffer;

  HDC hdc;

  ScrollWindowEx(hwnd, 0, -yChar, &rc,&rc,NULL,NULL,SW_INVALIDATE);

  hdc = GetDC (hwnd);

  SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT));

  TextOut (hdc,

xChar,

rc.bottom – yChar,

szBuffer,

wsprintf szBuffer,

szFormat,

szMessage, //消息

wParam, //虚拟键代码

(BYTE) (iType ? wParam :‘ ’),//显示字符值

LOWORD (lParam), // 重复次数

HIWORD (lParam) & 0xFF, // OEM键盘扫描码

//判断是否为增强键盘的扩展键

(PSTR) (0x& lParam ? “是” : “否”),

//判断是否同时使用了ALT键

(PSTR) (0x& lParam ? “是” : “否”),

(PSTR) (0x& lParam ? “按下” : “抬”),

//判断前一次击键状

(PSTR)(0x& lParam ? “按下” : “抬起”))

//判断转换状态?

);

  ReleaseDC (hwnd, hdc); ?

  ValidateRect (hwnd, NULL); ?

}

//函数:WndProc

//作用:处理主窗口的消息

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

  static char szTop =”消息键 字符 重复数 扫描码 扩展码 ALT 前一状态 转换状态”;

  static char szUnd =”_______ __ ____ _____ ______ ______ ___ _______ ______”;

  //在窗口中输出文字作为信息标题

  HDC hdc;

  PAINTSTRUCT ps;

  TEXTMETRIC tm;

  switch (iMsg)

  {

case

hdc = GetDC (hwnd); //设定字体

SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)); //检取当前字体的度量数据

GetTextMetrics (hdc, &tm);

xChar = tm.tmAveCharWidth;//保存字体平均宽度

yChar = tm.tmHeight; //保存字体高度

ReleaseDC (hwnd, hdc);

rc.top = 3 * yChar / 2;

return 0;

case

//窗体改变后保存新的滚屏区域右下角坐标

rc.right = LOWORD (lParam);

rc.bottom = HIWORD (lParam);

UpdateWindow (hwnd);

return 0;

case WM_PAINT: //处理窗口重绘消息

InvalidateRect (hwnd, NULL, TRUE);

hdc = BeginPaint (hwnd, &ps);

SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;

SetBkMode (hdc, TRANSPARENT) ;

TextOut (hdc, xChar, yChar / 2, szTop, (sizeof szTop) – 1) ;

TextOut (hdc, xChar, yChar / 2, szUnd, (sizeof szUnd) – 1) ;

EndPaint (hwnd, &ps);

return 0;

case WM_KEYDOWN:

//处理键盘上某一键按下的消息

ShowKey (hwnd, 0, “WM_KEYDOWN”,wParam, lParam);

return 0;

case WM_KEYUP:

//处理键盘上某一按下键被释放的消息

ShowKey (hwnd, 0, “WM_KEYUP”, wParam, lParam);

return 0;

case WM_CHAR:

//处理击键过程中产生的非系统键的可见字符消息

howKey (hwnd, 1, “WM_CHAR”, wParam, lParam);

return 0;

case WM_DEADCHAR:

//处理击键过程中产生的非系统键”死字符”消息

ShowKey (hwnd, 1, “WM_DEADCHAR”, wParam, lParam);

return 0;

case WM_SYSKEYDOWN:

//处理系统键按下的消息

ShowKey (hwnd, 0, “WM_SYSKEYDOWN”,wParam, lParam);

break;

case WM_SYSKEYUP:

//处理系统键抬起的消息

ShowKey (hwnd, 0, “WM_SYSKEYUP”, wParam, lParam);

break;

case

ShowKey (hwnd, 1, “WM_SYSCHAR”, wParam, lParam);

break;

case

ShowKey (hwnd, 1, “WM_SYSDEADCHAR”, wParam, lParam);

break;

case WM_DESTROY:

//处理结束应用程序的消息

PostQuitMessage (0);

return 0;

  }

  return DefWindowProc (hwnd, iMsg, wParam, lParam);

}

//函数:MyRegisterClass

//作用:注册窗口类

BOOL MyRegisterClass(HINSTANCE hInstance)

{

  wnd.cbSize= sizeof (wnd);

  wnd.style = CS_HREDRAW | CS_VREDRAW;

  wnd.lpfnWndProc = WndProc;

  wnd.cbClsExtra = 0;

  wnd.cbWndExtra = 0;

  wnd.hInstance = hInstance;

  wnd.hIcon = LoadIcon (NULL, IDI_APPLICATION);?

  wnd.hCursor = LoadCursor (NULL, IDC_ARROW);

  wnd.hbrBackground = (HBRUSH)

  GetStockObject (WHITE_BRUSH);

  wnd.lpszMenuName = NULL;

  wnd.lpszClassName = szAppName;

  wnd.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

  return RegisterClassEx (&wnd);

}

//函数:InitInstance

//作用:创建主窗口

BOOL InitInstance(HINSTANCE hInstance,int iCmdShow)

{

  HWND hwnd;

  hwnd = CreateWindow (szAppName,

   “键盘消息监视程序”,

   WS_OVERLAPPEDWINDOW,

   CW_USEDEFAULT,CW_USEDEFAULT,

   CW_USEDEFAULT,CW_USEDEFAULT,

   NULL,NULL,hInstance,NULL

   );

  if(!hwnd)

  {

return FALSE;

  }

  ShowWindow (hwnd, iCmdShow);

  UpdateWindow (hwnd);

  return TRUE;

关于linux 看门狗测试的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » Linux下看门狗测试,监控系统稳定性。 (linux 看门狗测试)