⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csdn_文档中心_给应用程序加装“看门狗”.htm

📁 csdn10年中间经典帖子
💻 HTM
📖 第 1 页 / 共 2 页
字号:
            color=#ffffff>标题</FONT></TD>
          <TD><B>&nbsp;&nbsp;&nbsp;&nbsp;给应用程序加装“看门狗”</B>&nbsp;&nbsp;&nbsp;&nbsp;bhw98(原作) 
          </TD></TR>
        <TR>
          <TD align=middle height=5></TD>
          <TD align=middle width=500></TD></TR>
        <TR>
          <TD align=middle bgColor=#003399><FONT color=#ffffff>关键字</FONT></TD>
          <TD width=500>&nbsp;&nbsp;&nbsp;&nbsp;进程 看门狗</TD></TR>
        <TR>
          <TD align=middle height=5></TD>
          <TD align=middle width=500></TD></TR></TBODY></TABLE><!--文章说明信息结束//-->
      <TABLE border=0 width=600>
        <TBODY>
        <TR>
          <TD align=left><BR>
            <STYLE>P.bhw98 {
	FONT-FAMILY: Verdana, Arial; FONT-SIZE: 9pt; LINE-HEIGHT: normal; MARGIN: 10px 0px 5px; PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
}
PRE.bhw98 {
	BACKGROUND-COLOR: #f0f0f0; FONT-SIZE: 9pt; LINE-HEIGHT: normal; MARGIN: 5px 0px; PADDING-BOTTOM: 5px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; PADDING-TOP: 5px
}
PRE.diag {
	FONT-SIZE: 9pt; LINE-HEIGHT: normal; MARGIN: 5px 0px; PADDING-BOTTOM: 5px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; PADDING-TOP: 5px
}
CODE.bhw98 {
	COLOR: #000000; FONT-SIZE: 9pt
}
TABLE.bhw98 {
	BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; FONT-FAMILY: Verdana, Arial; FONT-SIZE: 9pt; LINE-HEIGHT: normal; MARGIN: 3px 0px 10px
}
TD.bhw98 {
	BACKGROUND-COLOR: #f0f0f0; BORDER-BOTTOM: darkgray 1px solid; BORDER-LEFT: darkgray 1px solid; BORDER-RIGHT: darkgray 1px solid; BORDER-TOP: darkgray 1px solid; FONT-FAMILY: Verdana, Arial; FONT-SIZE: 9pt; LINE-HEIGHT: normal; MARGIN: 0px; PADDING-BOTTOM: 0px; PADDING-LEFT: 5px; PADDING-RIGHT: 10px; PADDING-TOP: 3px
}
STRONG.bhw98 {
	COLOR: #228b22; FONT-FAMILY: Verdana, Arial; FONT-SIZE: 20pt; FONT-STYLE: italic; FONT-WEIGHT: bolder
}
LI.bhw98 {
	FONT-FAMILY: Verdana, Arial; FONT-SIZE: 9pt; LINE-HEIGHT: normal; MARGIN: 3px 0px 0px 3px
}
H1.bhw98 {
	FONT-FAMILY: Verdana, Arial; FONT-SIZE: 12pt; FONT-WEIGHT: bolder; LINE-HEIGHT: normal; MARGIN-BOTTOM: 5px; MARGIN-TOP: 25px
}
H2.bhw98 {
	FONT-FAMILY: Verdana, Arial; FONT-SIZE: 10.5pt; FONT-WEIGHT: bolder; LINE-HEIGHT: normal; MARGIN-BOTTOM: 5px; MARGIN-TOP: 20px
}
H3.bhw98 {
	FONT-FAMILY: Verdana, Arial; FONT-SIZE: 9pt; FONT-WEIGHT: bolder; LINE-HEIGHT: normal; MARGIN-BOTTOM: 5px; MARGIN-TOP: 15px
}
SPAN.key {
	COLOR: #0000ff
}
SPAN.num {
	COLOR: #800000
}
SPAN.str {
	COLOR: #8b008b
}
SPAN.rem {
	COLOR: #008000
}
</STYLE>

            <P 
class=bhw98>相信大多数的程序员或用户,在Windows中见到类似于下面的亲切而又温馨的提示信息,都不会感到陌生:</P>
            <P 
            class=bhw98>“XXX执行了非法操作,将被关闭。要终止程序,请单击&lt;确定&gt;;要调试程序,请单击&lt;取消&gt;。”或者,“是否向Microsoft发送错误报告?&lt;发送&gt;,&lt;不发送&gt;。”</P>
            <P 
            class=bhw98>如果这个程序运行在无人值守、需要保持连续工作状态的场合,而其中的bug又一时难以排除,就需要采取应急措施,消除或减少程序出错造成的影响。本文讨论解决这个问题的办法。</P>
            <P 
            class=bhw98>做过一定硬件开发的人都知道,恶劣的工作环境,带有缺陷的硬件设计,不完善的算法等内外因素,都可能造成程序“跑飞”,因此专门加装一个“看门狗”,负责监视程序主体,必要时产生复位中断,有效地避免设备当机。</P>
            <P 
            class=bhw98>“看门狗”的思想,完全可以拿到高级语言编程中来用。基本做法是:设计一个简单的监视程序做为主进程,将原来的工作程序作为子进程,由主进程启动子进程并监视子进程的运行状态。子进程在发生严重错误时不弹出本文开始时描述的对话框,而是悄悄退出。主进程发现子进程退出后,重新启动子进程。如此反复。</P>
            <P class=bhw98>在具体实现上,下面以VC为例说明:</P>
            <H3>设置子进程为“静默模式”</H3>
            <P class=bhw98>在系统初始化部分(CWinApp或main中的开头),调用API函数SetErrorMode</P><PRE class=bhw98>SetErrorMode(SEM_NOGPFAULTERRORBOX);</PRE>
            <P class=bhw98>保证程序在发生严重错误时不弹出对话框,无需人工干预,自行退出。</P>
            <H3>启动子进程</H3>
            <P class=bhw98>在主进程中,创建子进程并运行。假定子进程的可执行文件为work.exe,示意性代码如下</P><PRE class=bhw98>STARTUPINFO si;
PROCESS_INFORMATION pi;
 
ZeroMemory( &amp;pi, sizeof(pi) );
ZeroMemory( &amp;si, sizeof(si) );
si.cb = sizeof(si);
 
// Start the child process
if (CreateProcess("work.exe", "", NULL, NULL, FALSE, 0, NULL, NULL, &amp;si, &amp;pi))
{
    // success
    … …
}
</PRE>
            <P 
            class=bhw98>CreateProcess有10个参数,看起来挺吓人,其实并不复杂,很容易理解。最后一个参数会返回子进程的ID和句柄等信息,后面就是对进程ID或句柄进行监视。</P>
            <H3>监视子进程</H3>
            <P 
            class=bhw98>定时检查子进程是否在正常运行。有好几个API都可以用于对指定ID的进程进行监视,象GetProcessVersion,GetProcessTimes,GetProcessIoCounters等,其中GetProcessVersion最简单,只有一个参数:</P><PRE class=bhw98>DWORD GetProcessVersion( DWORD ProcessId);</PRE>
            <P class=bhw98>当子进程已经退出时,该函数返回0。 
            <P class=bhw98>更为“专业”的函数是GetExitCodeProcess,它甚至能告诉我们子进程退出的原因:</P><PRE class=bhw98>BOOL GetExitCodeProcess(
    HANDLE hProcess,     // handle to the process
    LPDWORD lpExitCode   // termination status
);
</PRE>
            <H3>更进一步的考虑</H3>
            <P 
            class=bhw98>为增强系统的可靠性,给工作程序加装“看门狗”,不失为一种可行的技术方案。但如果有两套用户界面,看起来就有点不那么专业了。可将子进程设计为基于console的应用,不带用户界面,所有的信息都通过主进程窗口输出。主进程CreateProcess的第6个参数需加入CREATE_NO_WINDOW项,将子进程隐藏起来。这样从用户的角度看起来,就象只存在一个应用程序。</P>
            <P 
            class=bhw98>另一个问题是,如果用户关闭主进程,如何同时关闭子进程?用TerminateProcess函数固然能结束子进程,但可能会造成内存泄漏等新问题。最好是主进程向子进程发出结束的消息并进行同步,使子进程能够从容地退出。</P>
            <P 
            class=bhw98>再扩展一下,一个主进程可以同时管理多个子进程。典型的例子是利用多块网卡进行抓包、分析、处理的系统,将每一块网卡应用与一个子进程绑定,而主进程负责监视所有的子进程的工作。</P>
            <P class=bhw98>上面的讨论涉及到进程间通信(IPC)问题。解决的办法有很多,象file mapping, 
            mailslot, pipe, DDE, COM, RPC, clipboard, socket, 
            WM_COPYDATA等都能达到目的,可根据个人喜好和具体情况采用。</P>
            <H2 class=bhw98>[相关资源]</H2>
            <LI class=bhw98>科脑工作室(Kernel Studio):<A 
            href="http://www.kernelstudio.com/">http://www.kernelstudio.com/</A> 

            <HR>

            <P align=right class=bhw98>发布日期: 2004-04-27 
            <P 
class=bhw98>&nbsp;</P><BR></LI></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0 
width=770>
  <TBODY>
  <TR bgColor=#006699>
    <TD align=middle bgColor=#006699 id=white><FONT 
    color=#ffffff>对该文的评论</FONT></TD>
    <TD align=middle>
      <SCRIPT src="CSDN_文档中心_给应用程序加装“看门狗”.files/readnum.htm"></SCRIPT>
    </TD></TR></TBODY></TABLE>
<TABLE align=center bgColor=#666666 border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TD bgColor=#cccccc colSpan=3><SPAN style="COLOR: #cccccc"><IMG height=16 
      hspace=1 src="CSDN_文档中心_给应用程序加装“看门狗”.files/ico_pencil.gif" width=16> 
      </SPAN>&nbsp;&nbsp;&nbsp;&nbsp; xrenwu <I>(2004-5-2 21:35:27)</I> </TD></TR>
  <TR>
    <TD bgColor=#ffffff colSpan=3 width=532><BR>好!支持 
<BR></TD></TR></TBODY></TABLE><BR>
<DIV align=center>
<TABLE align=center bgColor=#cccccc border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TH bgColor=#006699 id=white><FONT 
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE border=0 width=770>
  <TBODY>
  <TR>
    <TD>你没有登陆,无法发表评论。 请先<A 
      href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=27281">登陆</A> 
      <A 
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR noShade SIZE=1 width=770>

<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
  <TBODY>
  <TR align=middle>
    <TD height=10 vAlign=bottom><A 
      href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A 
      href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A 
      href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A 
      href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A 
      href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A 
      href="http://www.csdn.net/english">English</A> </TD>
    <TD align=middle rowSpan=3><A 
      href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG 
      border=0 height=48 src="CSDN_文档中心_给应用程序加装“看门狗”.files/biaoshi.gif" 
      width=40></A></TD></TR>
  <TR align=middle>
    <TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
  <TR align=middle>
    <TD vAlign=top><FONT face=Verdana>Copyright &copy; CSDN.net, Inc. All rights 
      reserved</FONT></TD></TR>
  <TR>
    <TD height=15></TD>
    <TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--内容结束//--><!--结束//--></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -