自动复活异常终止进程 |
| 01-6-26 上午 10:09:05 |
| 问题的产生 |
| 微软公司的Windows 操作系统已深入到各个领域,基于Windows的应用程序更是层出不穷。但人们或多或少都有这样的经历,运行在Windows上的应用程序会发生异常终止,这时一般要通过手工重新将其启动。此时,若计算机无人看守,则异常终止的进程就有可能影响正常工作。笔者在开发GPS全球卫星定位系统控制中心程序时,就遇到过控制中心程序异常终止的情况。本文介绍一种方法,可以自动复活这种异常终止的进程。 |
| 实现原理 |
| 通常,把一个应用程序的一次运行实例叫做一个进程,在一个进程内又可包含多条可并发执行的路径,每条执行路径叫做一个线程,一个进程至少包含一个主线程。主线程负责执行运行的启动代码。另外,一个进程可以创建若干子进程。当进程被创建时,系统自动产生主线程,然后主线程可创建更多的线程。因此,我们可以编写一个程序,由其创建、启动子进程,并监视进程的运行情况,在其出现异常终止时,立即重新创建并启动子进程。 |
| 主要函数 |
| 1.创建一个子进程 |
| 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); |
| 参数说明: |
| lpApplicationName:新进程将要使用的可执行文件的名字,包含扩展名; |
| lpCommandLine:新进程的命令行,若lpApplicationName为NULL,则它的第一个参数是新进程将要使用的可执行文件的名字,可以不包含扩展名,系统默认是.exe文件; |
| 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; |
| piProcInfoGPS:PROCESS_INFORMATION; |
| 3.编写EstablishProcess过程的实现代码 |
| 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.在CreateProcess按钮的OnClick事件中调用过程 |
| EstablishProcess; |
| 5.为Timer1的OnTimer事件编写代码 |
| 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进程终止’); |
| CloseHandle(piProcInfoGPS.hThread); |
| CloseHandle(piProcInfoGPS.hProcess); |
| EstablishProcess; |
| end; |
| end; |
| 6.编译链接后运行程序 |
| 运行程序后可以看到c:/sr350/sr350buff.exe被启动,此时若杀掉sr350buff.exe进程,则sr350buff.exe自动再启动。注意:本文设可执行文件名为c:/sr350/sr350buff.exe,所以c:盘/sr350目录下需有sr350buff.exe文件。 |
博客可能围绕Delphi在Windows系统中的应用展开,涉及attributes和timer等相关内容,但因内容缺失,具体细节不明。
358

被折叠的 条评论
为什么被折叠?



