某程序因调用外部库比较多,容易异常退出,一时间未找到具体问题点,先让程序实现崩溃时自启动临时对付对付。
基本原理是以自身程序作为deamon进程,再通过参数(-child)控制启动子进程,加载自身业务真正需要运行的代码,deamon进程通过WaitForSingleObject等候子进程状态返回,当子进程非正常退出(exitcode <>0)则重启子进程。
unit uDeamon;
{
为减少其它单元initialization段加载造成的开销, 此单元需前置加载
}
interface
uses
Windows, SysUtils;
function isDeamonProcess():Boolean;
implementation
uses
uLog;
procedure runDeamon();
var
si: TStartupInfo;
pi: TProcessInformation;
exitCode: Cardinal;
exePath, command: String;
i, exitCount: Integer;
begin
ZeroMemory(@si, SizeOf(si));
ZeroMemory(@Pi, SizeOf(pi));
si.cb := SizeOf(si);
exePath := ParamStr(0);
for i := 1 to ParamCount do
command := command + ' ' + ParamStr(i);
command := exePath + ' ' + command + ' -child';
Log('Start child process: ' + command);
exitCount := 0;
repeat
if CreateProcess(nil, PChar(command), nil, nil, False, 0, nil, PChar(ExtractFileDir(exePath)), si, pi) then
begin
CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess, INFINITE);
GetExitCodeProcess(pi.hProcess, exitCode);
Inc(exitCount);
Log('Child exit: ' + IntToStr(exitCode) + ', Exit times: ' + IntToStr(exitCount));
CloseHandle(pi.hProcess);
if exitCount >= 20 then begin
// 连续重启超过20次后, 不再进行重启.
Log('Too many times to restart, an unrecoverable error maybe occur, child process will not be restart.');
Break;
end;
end else
Break;
until exitCode = 0;
end;
function hasChildParam(): Boolean;
var
i: Integer;
begin
Result := False;
for I := 1 to ParamCount do begin
if SameText(ParamStr(i), '-child') then begin
Result := True;
Break;
end;
end;
end;
function isDeamonProcess(): Boolean;
begin
Result := not hasChildParam();
end;
initialization
// 减少deamon进程开销, 在initialization段即执行相关代码
if not hasChildParam then begin
runDeamon;
ExitProcess(0);
end;
end.
分享到:
相关推荐
守护进程是长期运行的一种进程,不会与任一控制台绑定,如terminal、tty等,所以即使把运行守护进程的terminal关闭也无法关闭守护进程。上图中的?即代表不绑定任何控制台。Linux系统中守护进程的生命周期是从开机起...
虚拟光驱.听说现在居然收费了...
DeamonTools4.12.1虚拟光驱 DeamonTools4.12.1
最新汉化Deamon4.3 (支持Viata) 现在网上有很多游戏和软件都做成了ISO或者CCD等镜像格式,有些游戏,比如大宇出品的轩辕剑,大富翁7等游戏,由于游戏盘是加密的,所以镜像文件只能做成mds格式的。当你辛辛苦苦下载...
最新最好用的虚拟光驱,就是Deamontools advanced 5.2 只用最新版
这个是早期的 deamon tools ,小巧,不收费的。现在的已经开始收费,并且增加了N多无用的小插件,且体积也变大了。
live_deamon.dllC++版本的数据集里面如果某一个样本的某一个特征为0,这个特征可以不写在数据集中,但是在matlab版本中
本软件是一款DEAMON虚拟光驱软件的高级版本(or专业版),可以实现添加SCSI虚拟光驱和添加IDE虚拟光驱,在安装时需要验证,请确保你在联网的状态下安装。
现在我们手里有很多的ISO文件,这一款软件就是一款很好用的虚拟光驱,把你的ISO文件展示出来。
deamon tools for read img files
deamon tools 虚拟光驱 很好用的虚拟光驱
DEAMON TOOLS 3.47 虚拟光驱软件 DEAMON TOOLS 3.47 虚拟光驱软件 DEAMON TOOLS 3.47 虚拟光驱软件
虚拟光驱 好用,非常好用,你必须要用,哈哈
支持Vista系统的Deamon虚拟光驱
谷歌提供android 图片处理deamon,欢迎下载
linux系统服务程序需要一定的稳定性,那么守护程序可以使你的服务提供不间断的服务。这里是守护程序的简单实现。
一个不错的虚拟光驱工具,支持Win9x/win2k,支持ps,支持加密光盘,装完不需启动即可用。是一个先进的模拟备份并且合并保护盘的软件,可以备份SafeDisc保护的软件,可以打开CUE,ISO and CCD 等这些虚拟光驱的镜像...
antitheft_deamon
自动生成的简单daemon进程的shell脚本;
deamon虚拟光驱完美卸载.pdf