分享
 
 
 

给应用程序加装“看门狗”

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

P.bhw98

{

PADDING-RIGHT: 0px;

PADDING-LEFT: 0px;

FONT-SIZE: 9pt;

PADDING-BOTTOM: 0px;

MARGIN: 10px 0px 5px;

LINE-HEIGHT: normal;

PADDING-TOP: 0px;

FONT-FAMILY: Verdana, Arial

}

PRE.bhw98

{

FONT-SIZE: 9pt;

PADDING-RIGHT: 5px;

PADDING-LEFT: 5px;

PADDING-BOTTOM: 5px;

MARGIN: 5px 0px;

LINE-HEIGHT: normal;

PADDING-TOP: 5px;

BACKGROUND-COLOR: #f0f0f0

}

PRE.diag

{

FONT-SIZE: 9pt;

PADDING-RIGHT: 5px;

PADDING-LEFT: 5px;

PADDING-BOTTOM: 5px;

MARGIN: 5px 0px;

LINE-HEIGHT: normal;

PADDING-TOP: 5px;

}

CODE.bhw98

{

FONT-SIZE: 9pt;

COLOR: #000000

}

TABLE.bhw98

{

BORDER-RIGHT: #808080 1px solid;

BORDER-TOP: #808080 1px solid;

FONT-SIZE: 9pt;

MARGIN: 3px 0px 10px;

BORDER-LEFT: #808080 1px solid;

LINE-HEIGHT: normal;

BORDER-BOTTOM: #808080 1px solid;

FONT-FAMILY: Verdana, Arial

}

TD.bhw98

{

BORDER-RIGHT: darkgray 1px solid;

PADDING-RIGHT: 10px;

BORDER-TOP: darkgray 1px solid;

PADDING-LEFT: 5px;

FONT-SIZE: 9pt;

PADDING-BOTTOM: 0px;

MARGIN: 0px;

BORDER-LEFT: darkgray 1px solid;

LINE-HEIGHT: normal;

PADDING-TOP: 3px;

BORDER-BOTTOM: darkgray 1px solid;

FONT-FAMILY: Verdana, Arial;

BACKGROUND-COLOR: #f0f0f0

}

STRONG.bhw98

{

FONT-WEIGHT: bolder;

FONT-SIZE: 20pt;

COLOR: #228b22;

FONT-STYLE: italic;

FONT-FAMILY: Verdana, Arial

}

LI.bhw98

{

FONT-SIZE: 9pt;

MARGIN: 3px 0px 0px 3px;

LINE-HEIGHT: normal;

FONT-FAMILY: Verdana, Arial

}

H1.bhw98

{

MARGIN-TOP: 25px;

FONT-WEIGHT: bolder;

FONT-SIZE: 12pt;

MARGIN-BOTTOM: 5px;

LINE-HEIGHT: normal;

FONT-FAMILY: Verdana, Arial

}

H2.bhw98

{

MARGIN-TOP: 20px;

FONT-WEIGHT: bolder;

FONT-SIZE: 10.5pt;

MARGIN-BOTTOM: 5px;

LINE-HEIGHT: normal;

FONT-FAMILY: Verdana, Arial

}

H3.bhw98

{

MARGIN-TOP: 15px;

FONT-WEIGHT: bolder;

FONT-SIZE: 9pt;

MARGIN-BOTTOM: 5px;

LINE-HEIGHT: normal;

FONT-FAMILY: Verdana, Arial

}

SPAN.key

{

COLOR: #0000ff

}

SPAN.num

{

COLOR: #800000

}

SPAN.str

{

COLOR: #8b008b

}

SPAN.rem

{

COLOR: #008000

}

相信大多数的程序员或用户,在Windows中见到类似于下面的亲切而又温馨的提示信息,都不会感到陌生:

“XXX执行了非法操作,将被关闭。要终止程序,请单击;要调试程序,请单击。”或者,“是否向Microsoft发送错误报告?,。”

如果这个程序运行在无人值守、需要保持连续工作状态的场合,而其中的bug又一时难以排除,就需要采取应急措施,消除或减少程序出错造成的影响。本文讨论解决这个问题的办法。

做过一定硬件开发的人都知道,恶劣的工作环境,带有缺陷的硬件设计,不完善的算法等内外因素,都可能造成程序“跑飞”,因此专门加装一个“看门狗”,负责监视程序主体,必要时产生复位中断,有效地避免设备当机。

“看门狗”的思想,完全可以拿到高级语言编程中来用。基本做法是:设计一个简单的监视程序做为主进程,将原来的工作程序作为子进程,由主进程启动子进程并监视子进程的运行状态。子进程在发生严重错误时不弹出本文开始时描述的对话框,而是悄悄退出。主进程发现子进程退出后,重新启动子进程。如此反复。

在具体实现上,下面以VC为例说明:

设置子进程为“静默模式”

在系统初始化部分(CWinApp或main中的开头),调用API函数SetErrorMode

SetErrorMode(SEM_NOGPFAULTERRORBOX);

保证程序在发生严重错误时不弹出对话框,无需人工干预,自行退出。

启动子进程

在主进程中,创建子进程并运行。假定子进程的可执行文件为work.exe,示意性代码如下

STARTUPINFO si;

PROCESS_INFORMATION pi;

ZeroMemory( &pi, sizeof(pi) );

ZeroMemory( &si, sizeof(si) );

si.cb = sizeof(si);

// Start the child process

if (CreateProcess("work.exe", "", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))

{

// success

… …

}

CreateProcess有10个参数,看起来挺吓人,其实并不复杂,很容易理解。最后一个参数会返回子进程的ID和句柄等信息,后面就是对进程ID或句柄进行监视。

监视子进程

定时检查子进程是否在正常运行。有好几个API都可以用于对指定ID的进程进行监视,象GetProcessVersion,GetProcessTimes,GetProcessIoCounters等,其中GetProcessVersion最简单,只有一个参数:

DWORD GetProcessVersion( DWORD ProcessId);

当子进程已经退出时,该函数返回0。

更为“专业”的函数是GetExitCodeProcess,它甚至能告诉我们子进程退出的原因:

BOOL GetExitCodeProcess(

HANDLE hProcess, // handle to the process

LPDWORD lpExitCode // termination status

);

更进一步的考虑

为增强系统的可靠性,给工作程序加装“看门狗”,不失为一种可行的技术方案。但如果有两套用户界面,看起来就有点不那么专业了。可将子进程设计为基于console的应用,不带用户界面,所有的信息都通过主进程窗口输出。主进程CreateProcess的第6个参数需加入CREATE_NO_WINDOW项,将子进程隐藏起来。这样从用户的角度看起来,就象只存在一个应用程序。

另一个问题是,如果用户关闭主进程,如何同时关闭子进程?用TerminateProcess函数固然能结束子进程,但可能会造成内存泄漏等新问题。最好是主进程向子进程发出结束的消息并进行同步,使子进程能够从容地退出。

再扩展一下,一个主进程可以同时管理多个子进程。典型的例子是利用多块网卡进行抓包、分析、处理的系统,将每一块网卡应用与一个子进程绑定,而主进程负责监视所有的子进程的工作。

上面的讨论涉及到进程间通信(IPC)问题。解决的办法有很多,象file mapping, mailslot, pipe, DDE, COM, RPC, clipboard, socket, WM_COPYDATA等都能达到目的,可根据个人喜好和具体情况采用。

[相关资源]

科脑工作室(Kernel Studio):www.kernelstudio.com

发布日期: 2004-04-27

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有