【转】Windows守护进程的一种简单实现
一讲到守护进程,很多人都想到了Linux系统,确实在Windows上这个说的比较少。今天上午群里有个朋友问我了下Windows下守护进程的实现问题,我想了想,简单用C++写了个小例子,用来实现系统开机自启动(注册表启动),然后启动并守护指定的进程。基本功能还是挺简单的。和大家分享一下,直接上代码了哈。
/*
@描述:一个简单的Windows守护进程的例子(C++版本)
@作者:kikaylee
@日期:2016-05-13 10:30
*/
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <io.h>
#include <iostream>
using namespace std;
//隐藏DOS黑窗口
#pragma comment(linker,"/subsystem:\"windows\"  /entry:\"mainCRTStartup\"" ) 
//定义路径最大程度
#define MAX_PATH 4096
//定义守护进程名称
#define PROCCESS_NAME "test.exe"
//定义写入的注册表路径
#define SELFSTART_REGEDIT_PATH "Software\\Microsoft\\Windows\\CurrentVersion\\Run\\"
//设置本身开机自启动
BOOL SetSelfStart()
{
    //获取程序完整名称
    char pName[MAX_PATH]={0};
    GetModuleFileNameA(NULL,pName,MAX_PATH);
    //在注册表中写入启动信息
    HKEY hKey=NULL;
    LONG lRet=NULL;
    lRet=RegOpenKeyExA(HKEY_LOCAL_MACHINE,SELFSTART_REGEDIT_PATH,0,KEY_ALL_ACCESS,&hKey);
    //判断是否成功
    if(lRet!=ERROR_SUCCESS)
    {
        return FALSE;
    }
    lRet=RegSetValueExA(hKey,"testProtect",0,REG_SZ,(const unsigned char*)pName,strlen(pName)+sizeof(char));
    //判断是否成功
    if(lRet!=ERROR_SUCCESS)
    {
        return FALSE;
    }
    //关闭注册表
    RegCloseKey(hKey);
    return TRUE;
}
int main()
{
    //设置程序开机自启动
    if(!SetSelfStart())
    {
        cout<<"守护进程开机自启动失败"<<endl;
        return -1;
    }
    STARTUPINFOA si;
    //进程对象
    PROCESS_INFORMATION pi;
    //初始化
    ZeroMemory(&si,sizeof(si));
    si.cb=sizeof(si);
    ZeroMemory(&pi,sizeof(pi));
    //获取当前程序的路径
    char pPath[MAX_PATH]={0};
    GetCurrentDirectoryA(MAX_PATH,pPath);
    //拼接需要守护的程序
    strcat(pPath,"\\");
    strcat(pPath,PROCCESS_NAME);
    //构造cmd执行守护进程的字符串
    char pCmd[MAX_PATH]={0};
    strcat(pCmd,"cmd /c ");
    strcat(pCmd,pPath);
    //无限循环,监视守护进程
    do{
        //检查守护程序是否存在
        if(_access(pPath,0)!=-1)
        {
            //创建子进程,判断是否执行成功
            if(!CreateProcessA(NULL,pCmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
            {
                cout<<"守护进程启动失败,程序即将退出"<<endl;
                return -1;
            }
            //启动成功,获取进程的ID
            cout<<"守护进程成功,ID:"<<pi.dwProcessId<<endl;
            //无限等待子进程退出
            WaitForSingleObject(pi.hProcess,INFINITE);
            //如果退出了
            cout<<"守护进程退出了。。。"<<endl;
            //关闭进程和句柄
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
        }
        else
        {
            cout<<"守护程序不存在"<<endl;
        }
        //睡一下,重启
        Sleep(2000);
    }
    while(true);
    return 0;
}【转】Windows守护进程的一种简单实现的更多相关文章
- Windows守护进程简单示例
		转载: https://blog.csdn.net/kikaylee/article/details/51395360 /* @描述:一个简单的Windows守护进程的例子(C++版本) @作者:ki ... 
- windows守护进程脚本
		通常通过进程名称或者端口号来判断进程是否正在运行.但是windows下进程名常常难以区分,比如有两个python脚本程序A和B同时在执行,进程名都是python.exe.若是通过端口来区分,却又只适用 ... 
- windows 守护进程
		use Win32::Process::Info; while (1==1){ use Sys::Hostname; use HTTP::Date qw(time2iso str2time time2 ... 
- Linux守护进程简单介绍和实例具体解释
		Linux守护进程简单介绍和实例具体解释 简单介绍 守护进程(Daemon)是执行在后台的一种特殊进程.它独立于控制终端而且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种非常实用的进程. ... 
- 笔记整理--Linux守护进程
		Linux多进程开发(三)进程创建之守护进程的学习 - _Liang_Happy_Life__Dream - 51CTO技术博客 - Google Chrome (2013/10/11 16:48:2 ... 
- 守护进程的创建(syslog函数)
		守护进程(daemon)是指在后台运行的,没有控制终端与之相连的进程.它独立于控制终端,通常周期性的执行某种任务. 守护进程是一种很有用的进程.Linux的大多数服务器就是用守护进程的方式实现的,如I ... 
- Linux守护进程的编程实现(转)
		http://blog.csdn.net/zg_hover/article/details/2553321 http://blog.csdn.net/kongdefei5000/article/det ... 
- php写守护进程(Daemon)
		守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进程.php也可以实现守护进程的功能. 1.基本概念 进程 ... 
- Linux守护进程的编程实现
		Linux 守护进程的编程方法 守护进程(Daemon)是执行在后台的一种特殊进程.它独立于控制终端而且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种非常实用的进程.Linux的大多数s ... 
随机推荐
- vscode所用插件
- webpack初识
			1.什么是Webpack WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等) ... 
- 全排列问题Ⅱ(Java实现)
			题目: 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ]这个问题和我的上一篇问题分析的手法一样 ... 
- 牛客OI周赛4-提高组 B 最后的晚餐(dinner)
			最后的晚餐(dinner) 思路: 容斥 求 ∑(-1)^i * C(n, i) * 2^i * (2n-i-1)! 这道题卡常数 #pragma GCC optimize(2) #pragma GC ... 
- Codeforces 458C - Elections
			458C - Elections 思路: 三分凹形函数极小值域 代码: #include<bits/stdc++.h> using namespace std; #define ll lo ... 
- Python pymysql 增删改查封装
			关于pymysql 的增删改查,简单做个封装,方便后面使用直接拿来调用即可. 其中 增删改 的处理其实是一致的,本可以使用统一的方法,但是为了明显区分,这里分开来写了. 直接看代码就即可,如下: # ... 
- C# : 泛型的继承关系实现的一个可以存放不同数据类型的链表
			以下定义的是一个链表结点类型: internal sealed class Node<T> { public T m_data; public Node<T> m_next; ... 
- Appium解决搜索框问题
			appium解决搜索框: 1. 点击搜索,手工测试会弹出键盘,需要点击键盘上的搜索按钮. 2.但自动化的时候,键盘不能弹出.所以我们可以用回车等keycode代替搜索按钮. Press Keycode ... 
- 在python中使用正则表达式(二)
			这一节主要学习一下compile()函数和group()方法 1. re.compile() compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,然后就可以用编译后 ... 
- 雷林鹏分享:C# 常量
			C# 常量 常量是固定值,程序执行期间不会改变.常量可以是任何基本数据类型,比如整数常量.浮点常量.字符常量或者字符串常量,还有枚举常量. 常量可以被当作常规的变量,只是它们的值在定义后不能被修改. ... 
