自动复活异常终止进程

原创 2005年04月24日 09:13:00

自动复活异常终止进程


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文件。

异常死亡进程的自动复活

异常死亡进程的自动复活一、问题的产生 我们或多或少都有这样的经历,在Windows上运行的应用程序常常会异常终止,需要通过手工重新将其启动起来。若计算机无人看守,异常终止的进程不能实时启动,则可能给生...
  • zou5655
  • zou5655
  • 2001年12月09日 15:39
  • 1037

来源于跳一跳python脚本的自动刷百万英雄,芝士超人复活码python脚本!!!!

import os import sys import time import random def yes_or_no(prompt, true_value='y', false_value='n'...
  • Theway_s
  • Theway_s
  • 2018年01月14日 21:58
  • 763

解析木马复活技术-程序被删还会还原

我在无聊之中看到一款源码,下来看以后发现程序会创建一个ShieldThread线程 跟踪下去发现它会把自身读取到一个分配的内存空间,然后每个一段时间判断自身文件是否存在 如果不存在就从内存中写出文...
  • dongyewolong
  • dongyewolong
  • 2012年07月26日 09:34
  • 373

VB隐藏进程

Form中的代码Private Sub Command1_Click()    App.TaskVisible = False 任务栏隐藏    Call HideCurrentProcess 进程隐...
  • jyh_jack
  • jyh_jack
  • 2008年01月26日 11:25
  • 4891

linux中结束进程的两种方式:正常结束,异常结束

在linux系统中,有3种正常结束进程的方法和2种异常结束进程的方法, 一.  正常结束进程的3种方法 1) 在main函数中调用return,这相当于调用exit。 2) 调用exit函数。按...
  • stf1065716904
  • stf1065716904
  • 2017年07月07日 14:11
  • 396

进程异常终止--前台进程

问题:ssh登录服务器,并开启一个前台进程。等过了一会儿,当再来查看时,开启的进程还在不在呢?答案是进程挂掉。原因:ssh登录终端,超过一定时间没有操作后,网络断开,SIGHUP信号被发送给控制进程(...
  • lanyang123456
  • lanyang123456
  • 2017年03月05日 11:24
  • 306

【UNET自学日志】Part11 玩家复活

上一部分玩家摧毁的方法是设置其enable为false,那么玩家的复活就是在玩家死后,显示复活的按钮,点击按钮后把相关的enable再次设置为true即可 新建脚本Player_Respawn ...
  • sinat_24994943
  • sinat_24994943
  • 2016年04月23日 21:06
  • 656

安装oracle10g“程序异常终止。发生内部错误。请将以下文件提供给

试试看这样可以么: 首先、确保你有该文件夹的完全控制权。(修改:文件夹点右键 属性-〉安全-〉高级-〉所有者-〉改为自己。 接着编辑自己的权限为完全控制) 其次、将setup.exe的兼容性改为win...
  • tanzugan
  • tanzugan
  • 2014年06月01日 23:22
  • 1769

VB 进程死亡的自动复活

原文地址  http://yulv.net/archives/10/  前两天看了Delphi版面精华区中的《进程死亡的自动复活》一文,觉得作者的思路很不错,利用api来监视进程的活动,当被销毁时就自...
  • qinjueping
  • qinjueping
  • 2011年06月23日 09:02
  • 737

Linux 进程终止5种形式

1、main函数的自然返回,return 2、调用exit函数 3、调用_exit函数 4、调用abort函数 5、接受能导致进程终止的信号: ctrl+c (^C) SIGINT...
  • y396397735
  • y396397735
  • 2016年01月26日 16:58
  • 877
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自动复活异常终止进程
举报原因:
原因补充:

(最多只允许输入30个字)