如何判断一个程序没有响应

一.概述

一些重要的程序,必须让它一直跑着;而且还要时时关心它的状态——不能让它出现死锁现象。当然,如果一个主程序会出现死锁,肯定是设计或者编程上的失误。我们首要做的事是,把这个Bug揪出来。但如果时间紧迫,这个Bug又“飘忽不定”,那么,我们还是先写一个软件“看门狗”,暂时应一下急吧。

“看门狗”的需求描述:“看门狗”的运行不出现界面窗口,具有一定的隐蔽性;定时判断目标进程是否运行在当前系统中,如果没有则启动目标进程;判断目标进程是否“没有响应”,如果是则终止目标进程;如果目标进程“没有响应”的次数超过一定的数量,则将计算机系统重启。

二.预备知识

首先要介绍两个主要的函数,能够判断目标进程是否“没有响应”。在User32.dll中(没有文档公开),Win2k/NT下的IsHungAppWindow和Win9X下的IsHungThread;前者是以一个窗口句柄作为参数,后者是以线程ID作为参数。我们可以通过VC开发工具的Depends查到这两个函数。

要使用这两个函数,我们必须先动态导入,如下:

if (m_hUser32 == NULL)
{m_hUser32 = GetModuleHandle("USER32.DLL");
}
if (m_hUser32)
{m_IsHungNT  = (HUNG_FUNNT) GetProcAddress(m_hUser32, "IsHungAppWindow");m_IsHung9X  = (HUNG_FUN9X) GetProcAddress(m_hUser32, "IsHungThread");
}

另外,还有如下知识点:

1.    如何让窗口隐藏(当然通过Windows任务管理器还是可以看到的)

在框架窗口类的PreCreateWindow中修改窗口风格,如下:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{if( !CFrameWnd::PreCreateWindow(cs) )return FALSE;// TODO: Modify the Window class or styles here by modifying//  the CREATESTRUCT cscs.dwExStyle |= WS_EX_TOOLWINDOW;  // Make invisible in taskbarcs.style      = WS_POPUP;          // Hide the main windowreturn TRUE;
}

2.    如何让“看门狗”只运行一个进程

使用互斥量。在CWatchDogApp::InitInstance()中,执行如下代码:

bool CWatchDogApp::IsUniqueCopyInProc()
{m_Mutex = CreateMutex(NULL, TRUE, "System Watch Dog");if (GetLastError() == ERROR_ALREADY_EXISTS){return false;}return true;
}

该函数如果返回false,说明已经有一个WatchDog进程在运行了,当前进程就没有必要再执行下去了。在InitInstance如下处理:

if (!IsUniqueCopyInProc())

return FALSE;

3.    如何判断当前操作系统类型

bool CWatchDogApp::IsWinNT()
{OSVERSIONINFO OSVersionInfo;OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);GetVersionEx(&OSVersionInfo);if(OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT){return true;}returnfalse;
}

4.    如何自动重启计算机

在Win9x和Win2k/NT下,重启计算机的处理略有不同:

i

f (theApp.IsWinNT())
{// 在WinNT/2000下赋予关闭系统的权限staticHANDLE hToken;staticTOKEN_PRIVILEGES tp;staticLUID luid;
::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken ) ;::LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &luid );tp.PrivilegeCount          = 1;tp.Privileges[0].Luid      = luid;tp.Privileges[0].Attributes= SE_PRIVILEGE_ENABLED;::AdjustTokenPrivileges( hToken, FALSE, &tp,sizeof(TOKEN_PRIVILEGES), NULL, NULL );return::ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
}
else
{return::ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
}

5.    如何启动、结束其他进程

启动进程用CreateProcess,终止进程用TerminateProcess。参考代码如下:

bool CWatchDogView::RunTheSysProc()
{char    szPath[MAX_PATH];GetModuleFileName(NULL, szPath, MAX_PATH);CStringstrPath = szPath;strPath= strPath.Left(strPath.ReverseFind('\\')) + "\\HungDemo.exe";STARTUPINFO            StartInfo;PROCESS_INFORMATION    procStruct;memset(&StartInfo,0,sizeof(STARTUPINFO));StartInfo.cb = sizeof(STARTUPINFO);if(!::CreateProcess((LPCTSTR) strPath,NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&StartInfo,&procStruct))return false;returntrue;
}

需要提醒的是,TerminateProcess是在万不得已的情况下使用的,它不会进入进程使用的DLL的入口点通知“脱离”(Detaching)状态。有时候,这样做是很危险的(DLL内部的全局数据可能受影响较大)。

6.    如何让Win2k/NT自动登录

修改注册表。在HKEY_LOCAL_MACHINE目录下的Software\Microsoft\WindowsNT\ CurrentVersion\WinLogon下的AutoAdminLogon(字符串型)设置成1,并在DefaultUserName设置默认登录用户,DefaultPassword设置默认用户的密码。

7.    如何让Win2k/NT登录成功后直接执行你的程序(而不是默认的文件浏览器)

修改注册表。在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\ CurrentVersion\Winlogon\Shell的值从原先的explorer.exe修改为自己程序的绝对路径。

三.功能演示(Win2k/NT下)

友情提醒:开始演示之前,请先将你目前的工作保存。运行“看门狗”WatchDog;同时使用Ctrl+Alt+Del打开“Windows任务管理器”。稍候片刻,可以看到目标程序HungDemo会被启动(这个程序模拟了“没有响应”)。然后,WatchDog发现这个程序“没有响应”,则把它杀掉,然后重新启动一个新的HungDemo进程。如此的处理重复六次以后,系统会自动重启。

如何判断一个程序没有响应相关推荐

  1. 如何判断一个程序是 32bit 还是 64bit ?

    咨询区 Jonathan Allen 我有一个 .NET 应用程序,我觉得它现在是 32bit,但又不确定构建服务器是否真的帮我编译成了 32bit,请问我有什么办法可以检测当前的程序是否是真的 32 ...

  2. Windows编程-判断一个程序是64还是32位的小程序

    //编写一个判断进程是否位64位程序的函数 typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); LPFN_ISWOW64PROCES ...

  3. 判断一个程序员水平高低的标准?

    a.结果导向 胜者为王,败者为寇.也可以理解为做过什么NB的项目,带来了多少价值. b.竞赛比武 在同一平台下,大家八仙过海各显神通. c.广度和深度 在平时工作或交谈中,逼格最高者被大家膜拜. d. ...

  4. 如何判断一个程序员写代码好与不好?

    评判一段代码写得好不好,一般可以从以下几个方面来看: 1.代码书写是否符合业界通用规范,如PHP代码要符合PSR系列规范. 2.代码是否简洁,一段代码能用一行实现的尽量不要使用两行. 3.代码是否可重 ...

  5. Android Training - 避免程序无响应ANR

    可能你写的代码在性能测试上表现良好,但是你的应用仍然有时候会反应迟缓(sluggish),停顿(hang)或者长时间卡死(frezze),或者应用处理输入的数据花费时间过长.对于你的应用来说最槽糕的事 ...

  6. 如何分辨一个程序员是不是水货?

    最近有一位前同行问我:有哪些话一听就知道 一个程序员是个水货啊 他之所以问我这样的问题,主要是因为我面试过很多程序员 在这方面会有一些经验 还有就是他们公司也最近在招程序员 所以尽量避免招到一些不合适 ...

  7. 判断一个整数是否是水仙花数 || 编写程序,根据输入的月份和年份,求出该月的天数(1-12)|| 运算符的优先级问题 ||输出小写的a-z以及大写的Z—A||求出1-1/2+1/3-1/4…..1/

    判断一个整数是否是水仙花数,所谓水仙花数是指一个3位数,         其各个位上数字立方和等于其本身.例如: 153 = 1*1*1 + 5*5*5 + 3*3*3                 ...

  8. 使用程序判断一个文件是否是有效的PE文件

    判断一个文件是否为有效的PE文件,判断2个字段: DOS头的e_magic字段是否为0x5A4D: NT头的Signature字段是否为0x00004550: 若都是的话则是一个有效的PE文件: VC ...

  9. ubuntu c 判断程序是否启动_刚刚接触编程的我,怎么判断自己是否适合做一个程序员?...

    其实对于这个问题,很多刚刚进入大学选择计算机相关专业的小伙伴都会有类似的疑惑,不知道自己该不该学习编程,适不适合学习编程,以后走程序员这条路适不适合自己等等.那么今天,笔者在这里简单来说一下:我们如何 ...

  10. Java黑皮书课后题第7章:7.4(分析成绩)编写一个程序,读入个数不确定的考试分数,并且判断有多少个分数是大于或等于平均分,多少个分数是低于平均分的。输入一个负数表示输入结束。假设最高分是100

    7.4(分析成绩)编写一个程序,读入个数不确定的考试分数,并且判断有多少个分数是大于或等于平均分,多少个分数是低于平均分的.输入一个负数表示输入结束.假设最高分是100 题目 题目描述 破题 代码 运 ...

最新文章

  1. 使用TENSORRT和NVIDIA-DOCKER部署深部神经网络
  2. usaco Drainage Ditches(网络流dinic模板)
  3. JSON:如果你愿意一层一层剥开我的心,你会发现...这里水很深——深入理解JSON...
  4. 震后首游都江堰感怀(二)
  5. 关注Cortex-M处理器,M0、M3、M4简单对比
  6. java配置pom安装依赖包,Maven pom.xml 添加本地jar包依赖以及打包方法
  7. 机器学习博主推荐、博文推荐
  8. 小白的算法初识课堂(part1)--二分查找法
  9. ABAP调试器脚本的一个具体应用
  10. Dom4j完整教程~属性相关
  11. 各种排序(数据结构复习之内部排序算法总结)
  12. iOS11 获取手机已安装应用列表
  13. Windows Phone开发(12):认识一下独具个性的磁贴 转:http://blog.csdn.net/tcjiaan/article/details/7313866...
  14. PGP的安装及使用,利用加密软件PGP对邮件内容进行加密和解密,保姆级教学
  15. 在SQL Server2012上搭建Northwind详细教程,SQL2000SampleDb.msi的资源
  16. 百度网盘Python客户端bypy
  17. 【阅读笔记】旋转目标检测R3Det与BBAvector
  18. Grafana使用双Y坐标轴详解
  19. 印光法师:《灵岩遗旨》壹、悲化有情
  20. 24HTML5期末大作业:XXX 网站设计——指环王:护戒使者(13页) HTML+CSS+JavaScript HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程 网页规

热门文章

  1. Re5:读论文 TWAG: A Topic-guided Wikipedia Abstract Generator
  2. ubuntu设置自动关机
  3. 有趣的12张数学原理动图,令人舒心却又伤脑!你看懂几个?
  4. Go整合Logrus实现日志打印
  5. 【VUE项目实战】40、添加商品分类功能(一)
  6. 经济学的思维方式 [Basic Economics A Common Sense Guide to the Econom]
  7. 天玑810处理器怎么样 天玑810相当于什么水平
  8. MATLAB凸优化工具箱CVX用户手册-Chapter5
  9. cocos2dx.3.17中用VS2017启动本地windows调试器出现脚本错误解决办法
  10. python--pygame模块--外星人入侵小游戏项目(全)