本文为【异常死亡进程的自动复活】的汉字拼音对照版显示拼音
异yi常chang死si亡wang进jin程cheng的de自zi动dong复fu活huo
异yi常chang死si亡wang进jin程cheng的de自zi动dong复fu活huo
异yi常chang死si亡wang进jin程cheng的de自zi动dong复fu活huo
一yi、问wen题ti的de产chan生sheng
我wo们men或huo多duo或huo少shao都dou有you这zhe样yang的de经jing历li,在zaiWindows上shang运yun行xing的de应ying用yong程cheng序xu常chang常chang会hui异yi常chang终zhong止zhi,需xu要yao通tong过guo手shou工gong重chong新xin将jiang其qi启qi动dong起qi来lai。若ruo计ji算suan机ji无wu人ren看kan守shou,异yi常chang终zhong止zhi的de进jin程cheng不bu能neng实shi时shi启qi动dong,则ze可ke能neng给gei生sheng产chan造zao成cheng损sun失shi。
本ben人ren在zai开kai发faGPS全quan球qiu卫wei星xing定ding位wei系xi统tong控kong制zhi中zhong心xin程cheng序xu时shi,就jiu遇yu到dao过guo控kong制zhi中zhong心xin程cheng序xu异yi常chang终zhong止zhi死si亡wang的de情qing况kuang,由you此ci,找zhao出chu了le一yi个ge自zi动dong复fu活huo死si亡wang进jin程cheng的de方fang法fa,供gong参shen考kao。
二er、相xiang关guan知zhi识shi
通tong常chang,把ba一yi个ge应ying用yong程cheng序xu的de一yi次ci运yun行xing实shi例li叫jiao做zuo一yi个ge进jin程cheng,在zai一yi个ge进jin程cheng内nei又you可ke包bao含han多duo条tiao可ke并bing发fa执zhi行xing的de路lu径jing,每mei条tiao执zhi行xing路lu径jing叫jiao做zuo一yi个ge线xian程cheng,一yi个ge进jin程cheng至zhi少shao包bao含han一yi个ge主zhu线xian程cheng。主zhu线xian程cheng负fu责ze执zhi行xing运yun行xing的de启qi动dong代dai码ma。另ling外wai,一yi个ge进jin程cheng可ke以yi创chuang建jian若ruo干gan子zi进jin程cheng。当dang进jin程cheng被bei创chuang建jian时shi,系xi统tong自zi动dong产chan生sheng主zhu线xian程cheng,主zhu线xian程cheng然ran后hou可ke创chuang建jian更geng多duo的de线xian程cheng。
我wo们men可ke以yi编bian写xie一yi个ge程cheng序xu,让rang其qi创chuang建jian、启qi动dong子zi进jin程cheng,并bing监jian视shi进jin程cheng的de运yun行xing情qing况kuang,在zai其qi出chu现xian异yi常chang终zhong止zhi时shi,立li即ji重chong新xin创chuang建jian并bing启qi动dong子zi进jin程cheng即ji可ke。
三san、相xiang关guan函han数shu
1、创chuang建jian一yi个ge子zi进jin程cheng函han数shu:
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
参shen数shu说shuo明ming:
lpApplicationName:新xin进jin程cheng将jiang要yao使shi用yong的de可ke执zhi行xing文wen件jian的de名ming字zi,必bi须xu包bao含han扩kuo展zhan名ming。
LpCommandLine:新xin进jin程cheng的de命ming令ling行xing。若ruolpApplicationName为weiNULL,LpCommandLine 的de第di一yi个ge参shen数shu是shi新xin进jin程cheng将jiang要yao使shi用yong的de可ke执zhi行xing文wen件jian的de名ming字zi,可ke以yi不bu包bao含han扩kuo展zhan名ming,系xi统tong假jia定ding是shiexe文wen件jian。
LpProcessAttributes和helpThreadAttributes:分fen别bie是shi给gei进jin程cheng对dui象xiang和he线xian程cheng对dui象xiang指zhi定ding的de安an全quan属shu性xing。
BInheritHandles:指zhi定ding该gai进jin程cheng是shi否fou继ji承cheng其qi父fu进jin程cheng中zhong的de句ju柄bing。
dwCreationFlags:指zhi定ding新xin进jin程cheng产chan生sheng方fang式shi的de标biao志zhi,可ke用yong逻luo辑ji操cao作zuo符fuor相xiang连lian接jie。
LpEnvironment:指zhi向xiang含han有you新xin进jin程cheng将jiang要yao使shi用yong的de环huan境jing块kuai字zi符fu串chuan的de一yi块kuai内nei存cun,一yi般ban为weiNULL,使shi子zi进jin程cheng继ji承cheng父fu进jin程cheng的de一yi组zu环huan境jing块kuai。
LpCurrentDirectory:设she置zhi子zi进jin程cheng的de当dang前qian驱qu动dong器qi和he工gong作zuo目mu录lu, 为weiNULL,子zi进jin程cheng继ji承cheng父fu进jin程cheng的de当dang前qian驱qu动dong器qi和he工gong作zuo目mu录lu。
LpStartupInfo:指zhi向xiangSTARTUPINFO 的de结jie构gou。一yi般ban让rang子zi进jin程cheng使shi用yong缺que省sheng值zhi。但dan要yao把ba该gai结jie构gou中zhong的de所suo有you成cheng员yuan初chu始shi化hua为wei0,并bing设she置zhicb为wei结jie构gou大da小xiao。
STARTUPINFO 结jie构gou如ru下xia:
typedef struct _STARTUPINFO {
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
lpProcessInformation 参shen数shu指zhi向xiangLPPROCESS_INFORMATION结jie构gou,CreateProcess在zai返fan回hui之zhi前qian,填tian入ru有you关guan子zi进jin程cheng的de信xin息xi,父fu进jin程cheng正zheng是shi利li用yong该gai信xin息xi监jian测ce子zi进jin程cheng是shi否fou终zhong止zhi。该gai结jie构gou如ru下xia:
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION;
hProcess和hehThread分fen别bie是shi子zi进jin程cheng的de句ju柄bing和he子zi进jin程cheng的de主zhu线xian程cheng的de句ju柄bing,dwProcessId和hedwThreadId分fen别bie是shi子zi进jin程cheng的de标biao识shi号hao和he子zi进jin程cheng的de主zhu线xian程cheng的de标biao识shi号hao。
2、子zi进jin程cheng终zhong止zhi检jian测ce函han数shu
GetEXitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode );
Hprocess:进jin程cheng句ju柄bing,lpExitCode:进jin程cheng终zhong止zhi时shi的de退tui出chu码ma。
如ru果guo一yi个ge进jin程cheng没mei有you终zhong止zhi,lpExitCode 的de返fan回hui值zhi是shiSTILL_ACTIVE,否fou则ze返fan回hui其qi他ta值zhi。
四si、方fang法fa的deDelphi5语yu言yan实shi现xian
1、创chuang建jian一yi个ge新xin的de项xiang目mu Project1
选xuan择zeFile,New Application。在zai表biao单danForm1上shang放fang一yiMemo组zu件jian,一yi个geOK按an钮niu组zu件jian,改gai变bianOK按an钮niu组zu件jian的deCation属shu性xing为wei CreateProcess。再zai放fang一yi个getimer组zu件jian。设she置zhitimer组zu件jian的deInterval值zhi为wei1000,每mei秒miao检jian查cha一yi次ci进jin程cheng是shi否fou终zhong止zhi。
2、在zaiUnit1 Use节jie的deType后hou定ding义yi一yi个ge过guo程cheng
procedure EstablishProcess;
在zaiUnit1 Use节jie的deVar后hou定ding义yi一yi个ge变bian量liang:
piProcInfoGPS:PROCESS_INFORMATION;
3、在zaiUnit1 implementation节jie中zhong编bian写xieEstablishProcess过guo程cheng的de实shi现xian代dai码ma如ru下xia:
procedure EstablishProcess;
Var
siStartupInfo: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,piProcInfoGPS);
if( not fSuccess)then
Form1.Memo1.Lines.Add('Create Process Sr350buff fail.')
else
Form1.Memo1.Lines.Add('Create Process Sr350buff success.')
end;
4、在zaiCreateProcess按an钮niu的deOnClick事shi件jian中zhong调tiao用yong过guo程cheng
EstablishProcess;
5、为weiTimer1的deOnTimer事shi件jian编bian写xie代dai码ma:
Procedure TForm1.Timer1Timer(Sender: TObject);
Var
dwExitCode:DWORD;
fprocessExit:boolean;
Begin
dwExitCode:=0;
fprocessExit:=false;
fprocessExit:=GetExitCodeProcess(piProcInfoGPS.hProcess,dwExitCode);
if(fprocessExit and (dwExitCode<>STILL_ACTIVE))then
begin
Memo1.Lines.Add('SR350buff.exe进jin程cheng终zhong止zhi');
CloseHandle(piProcInfoGPS.hThread);
CloseHandle(piProcInfoGPS.hProcess);
EstablishProcess;
end;
End;
6、程cheng序xu中zhong设she可ke执zhi行xing文wen件jian名ming为weic:\sr350\sr350buff.exe,所suo以yic:盘pan\sr350目mu录lu下xia需xu有yousr350buff.exe文wen件jian。
7、编bian译yi联lian接jie,运yun行xingproject1,单dan击jiCreateProcess可ke见jianc:\sr350\sr350buff.exe启qi动dong。关guan掉diaosr350buff.exe进jin程cheng,可ke见jiansr350buff.exe自zi动dong再zai启qi动dong。
【原文】