# 守护进程 **Repository Path**: ky055/Daemon ## Basic Information - **Project Name**: 守护进程 - **Description**: 用来守护人脸识别窗口异常的进程 - **Primary Language**: C++ - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 3 - **Created**: 2017-09-27 - **Last Updated**: 2024-03-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 守护进程 用来守护人脸识别窗口异常的进程 ## 1. 守护进程实现 > 使用简单的守护进程,没有利用fork也没有使用钩子函数,利用system的`CreateProcessA()`函数来执行一个`cmd`命令,利用循环子进程的方式来实现这个守护进程,简单实用。 **代码:** 开机自启动注册表(管理员身份执行) //定义路径最大程度 #define MAX_PATH 4096 //定义守护进程名称 #define PROCCESS_NAME "你的程序名" //定义写入的注册表路径 #define SELFSTART_REGEDIT_PATH "Software\\Microsoft\\Windows\\CurrentVersion\\Run\\" //设置本身开机自启动 BOOL SetSelfStart() { //获取程序完整名称 char pName[MAX_PATH] = { 0 }; GetModuleFileNameA(NULL, pName, MAX_PATH); std::cout << "守护进程名:" << pName << std::endl; //在注册表中写入启动信息 HKEY hKey = NULL; LONG lRet = NULL; RegEnableReflectionKey(HKEY_LOCAL_MACHINE); lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, SELFSTART_REGEDIT_PATH, 0, KEY_ALL_ACCESS|KEY_WOW64_32KEY, &hKey); //判断是否成功 if (lRet != ERROR_SUCCESS) { return FALSE; } lRet = ::RegSetValueExA(hKey, "Daemon", 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; } SetUnhandledExceptionFilter(callback); 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; }