某程序因调用外部库比较多,容易异常退出,一时间未找到具体问题点,先让程序实现崩溃时自启动临时对付对付。
基本原理是以自身程序作为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.
分享到:
相关推荐
虚拟光驱.听说现在居然收费了...
《DeamonTools4.12.1:虚拟光驱技术详解及应用》 Deamon Tools是一款广受欢迎的虚拟光驱软件,其4.12.1版本为用户提供了高效便捷的光盘映像处理功能。在数字化存储日益普及的时代,虚拟光驱软件如Deamon Tools已经...
在标签中提到的“daemon”和“deamon_tools”,实际上是对软件名称的英文拼写变体,"daemon"是英文中代表“守护进程”的意思,在这里是指后台运行的服务程序,即Daemon Tools在后台默默工作,为用户提供虚拟光驱服务...
最新汉化Deamon4.3 (支持Viata) 现在网上有很多游戏和软件都做成了ISO或者CCD等镜像格式,有些游戏,比如大宇出品的轩辕剑,大富翁7等游戏,由于游戏盘是加密的,所以镜像文件只能做成mds格式的。当你辛辛苦苦下载...
在"linux deamon programming.txt"这个文本文件中,可能会包含具体的C语言代码示例,演示如何按照上述步骤实现一个简单的守护进程。通常,代码会包含初始化阶段的各个步骤,然后进入一个无限循环,直到接收到停止...
标题中的“虚拟光驱DEAMON”指的是DEAMON Tools,这是一个非常著名的虚拟光驱软件。虚拟光驱软件允许用户在计算机上创建虚拟驱动器,这些驱动器可以模拟实际的CD或DVD驱动器,但无需物理介质。DEAMON Tools是这类...
"我的deamon 传动系"这个标题可能是指一个与守护进程(Daemon)相关的软件系统或者一个自定义的服务管理工具,其核心是实现程序在后台稳定运行,类似于操作系统中的服务。守护进程通常在用户登录会话之外运行,为...
2. **后台运行**:为了实现类似守护进程的功能,程序可能使用`CreateService`或`SetServiceObjectSecurity`函数将进程设置为服务,这样即使没有用户登录,进程也能在后台持续运行。 3. **信号处理**:守护进程通常...
最新最好用的虚拟光驱,就是Deamontools advanced 5.2 只用最新版
DEAMON Tools Pro是一款在IT行业内广泛使用的专业虚拟光驱软件,它的全称可能是"DAEMON Tools Pro Advanced"。这款工具允许用户创建虚拟光驱,从而在计算机上模拟实际光盘的功能,而无需物理光盘。它对于那些频繁...
标题 "PHP5.6-DEAMON with composer" 指的是使用PHP 5.6版本结合Composer工具来实现一个守护进程(Deamon)服务。PHP从5.4版本开始引入了一个内置的Web服务器功能,这使得开发者在本地进行开发和测试时无需依赖...
它解决了 php 在这方面的局限性,并实现了一些合理的默认行为。 主要目标是提供一种健壮的方式来连续运行 php 代码,同时将业务逻辑与运行后台任务的细节分离。 我们像其他人一样讨厌多余的样板,所以守护进程有一...
live_deamon.dllC++版本的数据集里面如果某一个样本的某一个特征为0,这个特征可以不写在数据集中,但是在matlab版本中
"Deamon Tools虚拟光驱"是一款著名的虚拟光驱软件,被广泛用于计算机用户之中,尤其在游戏、软件安装和系统维护领域。...通过其提供的便捷功能,用户可以轻松管理和使用各种光盘镜像,实现高效的工作流程。
一个不错的虚拟光驱工具,支持Win9x/win2k,支持ps,支持加密光盘,装完不需启动即可用。是一个先进的模拟备份并且合并保护盘的软件,可以备份SafeDisc保护的软件,可以打开CUE,ISO and CCD 等这些虚拟光驱的镜像...
至于文件"frame",这可能是脚本的核心部分,包含了上述步骤的实现。如果要深入理解这个脚本的工作原理,需要查看其具体内容。通常,这样的脚本可以通过参数接收配置选项,例如pid文件路径、日志文件位置等。 总结来...
startDeamon()用于初始化守护进程并创建子进程;start()方法用于执行守护进程的主循环;stop()方法用于停止守护进程;run()方法是类的入口点,根据传入参数决定执行start()或stop()。 2. 守护进程的初始化。在start...
3. **快速加载与卸载**:快速加载光盘映像,实现即插即用的便捷性,同时也能迅速卸载,切换不同映像文件。 4. **光盘刻录**:虽然主要功能是虚拟光驱,但部分版本还支持光盘刻录功能,用户可以将数据写入物理光盘。 ...
同时,它还有着快速的虚拟光驱响应速度,能实现几乎与物理光驱相同的速度读取镜像数据,无论是游戏安装还是软件运行,都能流畅进行,减少了物理光驱的磨损,延长了设备寿命。 值得注意的是,3.47版本的Daemon Tools...