C++实现Windows下的Daemon,监控多个进程

来源:互联网 发布:淘宝客服是怎么做的 编辑:程序博客网 时间:2024/05/16 23:56

在windows下,可以用简单的bat实现守护进程的功能,如果dump掉就重新拉起来,百度下就能查到,举个例子:

@echo off::检测时间间隔,单位:秒set _interval=5::需要守护的进程名称set _processName=print_hello.exe::需要守护的进程启动命令set _processCmd=D:\SVN\print_hello.exe::set _processCmd=print_hello.exe::需要守护的进程预估启动完毕所需时间,单位:秒set _processTimeout=1::进程用户名,一般是Administrator set _username=adminstrator:LOOPset /a isAlive=false::tasklist /FI "username eq %_username%" | find /C "%_processName%" > temp.txt tasklist | find /C "%_processName%" > temp.txtset /p num= < temp.txtdel /F temp.txtif "%num%" == "0" ( start %_processCmd% | echo start %_processName% at %time% choice /D y /t %_processTimeout% > nul)if "%num%" NEQ "0" echo %_processName% is running choice /D y /t %_interval% >nulgoto LOOP

这段脚本就可以实现一个Daemon,隔5秒监控print_hello.exe程序一次,保证此程序在系统中的存活,可以用相对路径,也可以用绝对路径;

但用脚本总归有一些限制,比如我这边项目需要监控多个进程,而且是同名的进程,仅能用路径进行区分,对于这类的需求,以上的脚本实现起来相对麻烦,于是自己用C++开发了一个简单的Daemon.exe,通过读取配置文件,可同时监控多个进程,代码如下:

#include <iostream> #include <windows.h> #include <process.h> #include <stdio.h> #include <tchar.h> #include <string.h>using namespace std; #define MAX_THREAD 5DWORD WINAPI Daemonproc(LPVOID lpParameter){char *path = (char *)lpParameter;cout << "child process  " << path<< endl;STARTUPINFO si; PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); do{ if(!CreateProcess( NULL,path,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)){ cout << "创建进程失败.." << GetLastError() << endl; return 0; } WaitForSingleObject( pi.hProcess, INFINITE);cout << "子进程已经退出..." << endl; CloseHandle(pi.hProcess); CloseHandle(pi.hThread); }while(true);return 0; }int main(int argc, char *argv[]) { char number[32] = {0};char **path;char chpath[128] = {0};string strpath;GetModuleFileName(NULL,(LPSTR)chpath,sizeof(chpath)); strpath = chpath;size_t pos = strpath.rfind("\\");string strpath2 = strpath.substr(0, pos);strpath2 +="\\guard.ini"; GetPrivateProfileString("PROCESSNUM", "num", NULL, number, 32, strpath2.c_str());int pnum = atoi(number);path = (char **)malloc(pnum * sizeof(char*));for (int i = 0; i < pnum; i++){path[i] = (char*)malloc(128);}char c_tmp[32] = {0};HANDLE hd[MAX_THREAD];for (int i = 0; i < pnum; i++){memset(c_tmp, 0, 32);memset(path[i], 0, 128);sprintf(c_tmp, "path%d", i+1);GetPrivateProfileString("PROCESSPATH", c_tmp, NULL, path[i], 128, strpath2.c_str());hd[i] = CreateThread(NULL,0,Daemonproc,path[i],0,NULL);if (hd[i] == NULL){ExitProcess(i);}}WaitForMultipleObjects(pnum,hd,TRUE,INFINITE);for ( int j  = 0; j < pnum; j++){CloseHandle(hd[j]);}}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孕晚期胃疼呕吐怎么办 胃疼了一晚上怎么办 微信视频图像倒立怎么办 ps链接图层锁定怎么办 慕课过时间了怎么办 异地恋又要考研怎么办 阴阳师手机绑定上限了怎么办 高考口令卡丢了怎么办 网易将军令换手机了怎么办 须弥bb有弱点土怎么办 战网密码忘记了怎么办 梦三账号忘了怎么办 快手手机号被注册了怎么办 快手该手机号已注册怎么办 手机号被别人注册了快手怎么办 快手显示手机号已注册怎么办 163的邮箱忘了怎么办 河长制账号密码忘了怎么办 网易登录名忘了怎么办 网易通行证安全手机忘了怎么办 美团数据获取失败怎么办 扣扣图片加载不出来怎么办 电脑qq最小化后不见了怎么办 uwp桌面快捷图标显示异常怎么办 网易云自动切歌怎么办 捡到小米手机怎么办才能自己用 dnf启动安装程序出错怎么办 苹果手机相册视频下载出错怎么办 苹果7软件闪退怎么办 微信上有钱账号就是怎么办 手机网速不给力怎么办 xp系统登录密码忘了怎么办 手机百度云网络出错怎么办 百度账号提示异常风险怎么办 刷xp框架卡米怎么办 全民k歌歌曲下架怎么办 全民k歌伴奏下架怎么办 苹果手机图片的图标打不开怎么办 电脑页面加载不出来怎么办 电脑主页面加载不出来怎么办 桌面图标不见了怎么办右键无反应