当前位置:C++技术网 > 精选软件 > 守护进程的原理和C++实现守护进程的代码

守护进程的原理和C++实现守护进程的代码

更新时间:2016-11-19 00:48:25浏览次数:1+次

    守护进程,顾名思义,也就是专门守护一个进程的进程。守护进程的职责就是专门确保被指定的进程的运行。

    最直接的应用就是重启进程。如果我们的软件崩溃了,为了让软件重新运行起来,软件本身是无法不方便或者无法做到的。因为出故障就是软件本身,而这个故障严重到迫使软件本身挂掉了,自然也没有办法重启自己了。

    那么可以借助一个专门的进程来帮助自己启动咯。守护进程当然不仅限于重启进程咯。要实现什么守护功能,就看你怎么实现了。你可以守护进程不被关闭,重启进程,也可以守护进程的网络,必要的配置文件等等。

    守护进程好比是保镖,被守护的进程就是保镖保护的对象。守护进程在很多地方都会有应用。

    我就先拿QQ来举例说明守护进程可以做的事情之一,即启动进程。

    QQ的安装目录如下所示:

QQ的安装目录

    我们通过右击桌面的QQ快捷方式,然后“打开文件位置”,就可以打开QQ安装目录,如下图所示:

打开QQ安装目录

    然后我们看到自动定位的是QQScLauncher这个应用程序文件,而不是QQ这个应用程序文件。你会不会觉得奇怪呢?Launcher是发射、启动的意思。根据文件名也可以判断,这个程序是启动程序,但不是主程序。

    也就是说,QQ是间接被启动的,并不是我们的QQ快捷方式指定的程序。同样,为了让守护进程能够第一时间被启动,对进程的状态进行实时检测,我们可以让守护进程先启动,然后守护进程在检测环境安全的情况下,启动主进程,并且守护进程实时检测主进程的运行状态,守护进程一直后台运行着。一旦主进程被关闭了,守护进程就重新启动主进程程序。

    很多后台软件中途崩溃了,但是后台软件需要时刻运行,我们不能等着管理员去手动启动软件。所以,有了守护进程,就可以一直确保主进程是在运行的,也就可以时刻确保软件在运行。出故障也只是临时退出了而已。

    那么我们这里的守护进程要做的事情就是,在守护进程启动后,马上启动主进程,然后时刻检测主进程是否退出,如果退出了,就马上重新启动一个主进程。也就是说,你只要启动守护进程,也就可以启动主进程了。那么我们这里的守护进程就和QQScLauncher启动程序的功能一样的,只是多了重启进程的功能。不管是你手动关闭软件,还是异常崩溃了导致退出,守护进程都可以自动重启主进程。

    下面就来说说如何用C++实现守护进程。

    首先是创建进程,我们使用CreateProcess函数来创建进程,可以通过命令行参数来指定exe文件,加载exe程序映像文件创建进程。然后就是死等主进程退出运行的信号,即调用函数WaitForSingleObject。

    所以整个的代码就是下面这样了:


#include <Windows.h>
#include "tchar.h"
//此处设置;链接器可以让启动的控制台程序后台运行,看不到界面。
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
void main()
{
    while(true)
    {
        TCHAR szCmdLine[]=_T("./1.exe"); //要启动的程序,被守护的exe程序文件路径
        STARTUPINFO si = {sizeof(si)};//启动信息结构体
		PROCESS_INFORMATION pi={0};//创建后的进程信息结构体
        if(!CreateProcess(NULL,szCmdLine,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) 
        { 
            ::MessageBox(NULL,_T("启动失败!"),_T("启动程序提示"),0); 
            return;
        }
        WaitForSingleObject(pi.hProcess,INFINITE);
		CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    }
}
     代码就不多解释了,代码中有详细注释,如果需要了解启动进程,可以阅读《在程序写代码启动/调用浏览器和外部程序》,如果想了解守护进程的另一个用法,即自删除功能实现,可以阅读《程序自删除技术实现源码分享和技术实现详细分析》。