01-6-26 上午 10:09:05
問題的產生
微軟公司的windows 作業系統已深入到各個領域,基於windows的應用程式更是層出不窮。但人們或多或少都有這樣的經歷,執行在windows上的應用程式會發生異常終止,這時一般要通過手工重新將其啟動。此時,若計算機無人看守,則異常終止的程序就有可能影響正常工作。筆者在開發***全球衛星定位系統控制中心程式時,就遇到過控制中心程式異常終止的情況。本文介紹一種方法,可以自動復活這種異常終止的程序。
實現原理
通常,把乙個應用程式的一次執行例項叫做乙個程序,在乙個程序內又可包含多條可併發執行的路徑,每條執行路徑叫做乙個執行緒,乙個程序至少包含乙個主線程。主線程負責執行執行的啟動**。另外,乙個程序可以建立若干子程序。當程序被建立時,系統自動產生主線程,然後主線程可建立更多的執行緒。因此,我們可以編寫乙個程式,由其建立、啟動子程序,並監視程序的運**況,在其出現異常終止時,立即重新建立並啟動子程序。
主要函式
1.建立乙個子程序
lptstr lp***mandline,
lpsecurity_attributes lpprocessattributes,
lpsecurity_attributes lpthreadattributes,
bool binherithandles,
dword dwcreationflags,
lpvoid lpenvironment,
lpctstr lpcurrentdirectory,
lpstartupinfo lpstartupinfo,
lpprocess_information lpprocessinformation);
引數說明:
lpprocessattributes和lpthreadattributes:分別是給程序物件和執行緒物件指定的安全屬性;
binherithandles:指定該程序是否繼承其父程序的控制代碼;
dwcreationflags:指定新程序產生方式的標誌,在不同方式之間可用邏輯操作符or相連線;
lpenvironment:指向含有新程序將要使用的環境塊字串的一塊記憶體,一般為null;
lpcurrentdirectory:設定子程序的當前驅動器和工作目錄, 為null時,子程序繼承父程序的當前驅動器和工作目錄;
lpstartupinfo:指向startupinfo 結構,一般子程序使用預設值,但要把該結構中的所有成員初始化為0,並設定cb為結構大小;
lpprocessinformation:該引數指向lpprocess_information結構,createprocess在返回之前,填入有關子程序的資訊,父程序正是利用該資訊監測子程序是否終止。
2.子程序終止檢測函式
getexitcodeprocess(handle hprocess, lpdword lpexitcode );
其中hprocess為程序控制代碼,lpexitcode為程序終止時的退出碼。如果乙個程序沒有終止,lpexitcode 的返回值是still_active,否則返回其他值。
程式設計實現
本文以delphi 5為例,介紹該方法的具體實現步驟。
1.建立乙個新專案
在表單form1上放置乙個memo元件和乙個ok按鈕元件,改變ok按鈕元件的caption屬性為createprocess。再放置乙個timer元件,設定timer元件的interval值為1000,即每秒鐘檢查一次程序是否終止。
2.說明過程和變數
procedure establishprocess;
piprocinfo***:process_information;
3.編寫establishprocess過程的實現**
procedure establishprocess;
varsistartupinfo:startupinfo;
saprocess,sathread:security_attributes;
fsuccess:boolean;
begin
fsuccess:=false;
zeromemory(@sistartupinfo,sizeof(sistartupinfo));
sistartupinfo.cb:=sizeof(sistartupinfo);
saprocess.nlength:=sizeof(saprocess);
saprocess.lpsecuritydescriptor:=pchar(nil);
saprocess.binherithandle:=true;
sathread.nlength:=sizeof(sathread);
sathread.lpsecuritydescriptor:=pchar(nil);
sathread.binherithandle:=true;
fsuccess:=createprocess(pchar(nil),『c:/sr350/sr350buff』,@saprocess,@sathread,false,create_default_error_mode,pchar(nil),
pchar(nil),sistartupinfo,piprocinfo***);
if( not fsuccess)then
form1.memo1.lines.add(『create process sr350buff fail.』)
else
form1.memo1.lines.add(『create process sr350buff success.』)
end;
4.在createprocess按鈕的onclick事件中呼叫過程
establishprocess;
5.為timer1的ontimer事件編寫**
procedure tform1.timer1timer(sender: tobject);
vardwexitcode:dword;
fproces***it:boolean;
begin
dwexitcode:=0;
fproces***it:=false;
fproces***it:=getexitcodeprocess
(piprocinfo***.hprocess,dwexitcode);
if(fproces***it and (dwexitcode<>
still_active))then
begin
memo1.lines.add(『sr350buff.exe程序終止』);
closehandle(piprocinfo***.hthread);
closehandle(piprocinfo***.hprocess);
establishprocess;
end;
end;
6.編譯鏈結後執行程式
執行程式後可以看到c:/sr350/sr350buff.exe被啟動,此時若殺掉sr350buff.exe程序,則sr350buff.exe自動再啟動。注意:本文設可執行檔名為c:/sr350/sr350buff.exe,所以c:盤/sr350目錄下需有sr350buff.exe檔案。
執行緒異常終止
trycatch exception e finally 釋放資源 有人可能覺得 exception 有些大了,實際不然,因為你也不知道會丟擲什麼異常。被0除,numberformatexception,是一些不是必須捕獲的異常,遇到這些異常不處理會造成一些不必要的麻繁。為了執行緒不會被這些異常終止...
程序的終止
系統呼叫exit 實現程序的終止。exit 在linux系統函式庫stdlib.h中的函式宣告如下 void exit int status exit 只有乙個引數status,稱作程序的退出狀態,父程序可以使用它的低8位。exit 的返回值通常用於指出程序所完成任務的成敗。如果成功,則返回0 如果...
程序的終止
通常採用exit來結束乙個程序 相應的函式呼叫為 include void exit int status int atexit void function void int on exit void function int void void arg void abort void includ...