?? csdn_文檔中心_給應(yīng)用程序加裝“看門狗”.htm
字號:
color=#ffffff>標題</FONT></TD>
<TD><B> 給應(yīng)用程序加裝“看門狗”</B> 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>關(guān)鍵字</FONT></TD>
<TD width=500> 進程 看門狗</TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR></TBODY></TABLE><!--文章說明信息結(jié)束//-->
<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>相信大多數(shù)的程序員或用戶,在Windows中見到類似于下面的親切而又溫馨的提示信息,都不會感到陌生:</P>
<P
class=bhw98>“XXX執(zhí)行了非法操作,將被關(guān)閉。要終止程序,請單擊<確定>;要調(diào)試程序,請單擊<取消>。”或者,“是否向Microsoft發(fā)送錯誤報告?<發(fā)送>,<不發(fā)送>?!?lt;/P>
<P
class=bhw98>如果這個程序運行在無人值守、需要保持連續(xù)工作狀態(tài)的場合,而其中的bug又一時難以排除,就需要采取應(yīng)急措施,消除或減少程序出錯造成的影響。本文討論解決這個問題的辦法。</P>
<P
class=bhw98>做過一定硬件開發(fā)的人都知道,惡劣的工作環(huán)境,帶有缺陷的硬件設(shè)計,不完善的算法等內(nèi)外因素,都可能造成程序“跑飛”,因此專門加裝一個“看門狗”,負責監(jiān)視程序主體,必要時產(chǎn)生復位中斷,有效地避免設(shè)備當機。</P>
<P
class=bhw98>“看門狗”的思想,完全可以拿到高級語言編程中來用。基本做法是:設(shè)計一個簡單的監(jiān)視程序做為主進程,將原來的工作程序作為子進程,由主進程啟動子進程并監(jiān)視子進程的運行狀態(tài)。子進程在發(fā)生嚴重錯誤時不彈出本文開始時描述的對話框,而是悄悄退出。主進程發(fā)現(xiàn)子進程退出后,重新啟動子進程。如此反復。</P>
<P class=bhw98>在具體實現(xiàn)上,下面以VC為例說明:</P>
<H3>設(shè)置子進程為“靜默模式”</H3>
<P class=bhw98>在系統(tǒng)初始化部分(CWinApp或main中的開頭),調(diào)用API函數(shù)SetErrorMode</P><PRE class=bhw98>SetErrorMode(SEM_NOGPFAULTERRORBOX);</PRE>
<P class=bhw98>保證程序在發(fā)生嚴重錯誤時不彈出對話框,無需人工干預,自行退出。</P>
<H3>啟動子進程</H3>
<P class=bhw98>在主進程中,創(chuàng)建子進程并運行。假定子進程的可執(zhí)行文件為work.exe,示意性代碼如下</P><PRE class=bhw98>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
… …
}
</PRE>
<P
class=bhw98>CreateProcess有10個參數(shù),看起來挺嚇人,其實并不復雜,很容易理解。最后一個參數(shù)會返回子進程的ID和句柄等信息,后面就是對進程ID或句柄進行監(jiān)視。</P>
<H3>監(jiān)視子進程</H3>
<P
class=bhw98>定時檢查子進程是否在正常運行。有好幾個API都可以用于對指定ID的進程進行監(jiān)視,象GetProcessVersion,GetProcessTimes,GetProcessIoCounters等,其中GetProcessVersion最簡單,只有一個參數(shù):</P><PRE class=bhw98>DWORD GetProcessVersion( DWORD ProcessId);</PRE>
<P class=bhw98>當子進程已經(jīng)退出時,該函數(shù)返回0。
<P class=bhw98>更為“專業(yè)”的函數(shù)是GetExitCodeProcess,它甚至能告訴我們子進程退出的原因:</P><PRE class=bhw98>BOOL GetExitCodeProcess(
HANDLE hProcess, // handle to the process
LPDWORD lpExitCode // termination status
);
</PRE>
<H3>更進一步的考慮</H3>
<P
class=bhw98>為增強系統(tǒng)的可靠性,給工作程序加裝“看門狗”,不失為一種可行的技術(shù)方案。但如果有兩套用戶界面,看起來就有點不那么專業(yè)了??蓪⒆舆M程設(shè)計為基于console的應(yīng)用,不帶用戶界面,所有的信息都通過主進程窗口輸出。主進程CreateProcess的第6個參數(shù)需加入CREATE_NO_WINDOW項,將子進程隱藏起來。這樣從用戶的角度看起來,就象只存在一個應(yīng)用程序。</P>
<P
class=bhw98>另一個問題是,如果用戶關(guān)閉主進程,如何同時關(guān)閉子進程?用TerminateProcess函數(shù)固然能結(jié)束子進程,但可能會造成內(nèi)存泄漏等新問題。最好是主進程向子進程發(fā)出結(jié)束的消息并進行同步,使子進程能夠從容地退出。</P>
<P
class=bhw98>再擴展一下,一個主進程可以同時管理多個子進程。典型的例子是利用多塊網(wǎng)卡進行抓包、分析、處理的系統(tǒng),將每一塊網(wǎng)卡應(yīng)用與一個子進程綁定,而主進程負責監(jiān)視所有的子進程的工作。</P>
<P class=bhw98>上面的討論涉及到進程間通信(IPC)問題。解決的辦法有很多,象file mapping,
mailslot, pipe, DDE, COM, RPC, clipboard, socket,
WM_COPYDATA等都能達到目的,可根據(jù)個人喜好和具體情況采用。</P>
<H2 class=bhw98>[相關(guān)資源]</H2>
<LI class=bhw98>科腦工作室(Kernel Studio):<A
href="http://www.kernelstudio.com/">http://www.kernelstudio.com/</A>
<HR>
<P align=right class=bhw98>發(fā)布日期: 2004-04-27
<P
class=bhw98> </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_文檔中心_給應(yīng)用程序加裝“看門狗”.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_文檔中心_給應(yīng)用程序加裝“看門狗”.files/ico_pencil.gif" width=16>
</SPAN> 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>你沒有登陸,無法發(fā)表評論。 請先<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">網(wǎng)站簡介</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=5">廣告服務(wù)</A> - <A
href="http://www.csdn.net/map/map.shtm">網(wǎng)站地圖</A> - <A
href="http://www.csdn.net/help/help.asp">幫助信息</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=2">聯(lián)系方式</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_文檔中心_給應(yīng)用程序加裝“看門狗”.files/biaoshi.gif"
width=40></A></TD></TR>
<TR align=middle>
<TD vAlign=top>百聯(lián)美達美公司 版權(quán)所有 京ICP證020026號</TD></TR>
<TR align=middle>
<TD vAlign=top><FONT face=Verdana>Copyright © CSDN.net, Inc. All rights
reserved</FONT></TD></TR>
<TR>
<TD height=15></TD>
<TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--內(nèi)容結(jié)束//--><!--結(jié)束//--></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -