日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

windows下的守护进程C++

發布時間:2025/3/12 c/c++ 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 windows下的守护进程C++ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 守護進程

1.1 需求分析

我有三個程序需要不斷運行,有可能出現某些未知的原因而宕掉,需要本守護程序來進行守護,發現它運行不管,死掉就重啟它,并且服務器開機就啟動。

1.2 使用方法

將該程序與需要守護的程序放在同一目錄。修改以下幾處

  • 守護的程序的絕對路徑 twkWindowName_DownloadWget
  • 定義守護進程名稱 PROCCESS_NAME_DOWMLOADWGET
  • 需要守護的程序所在的路徑 PROGRAMEPATH

開發環境:

  • Windows10專業版
  • Visual Studio 2017 Enterprise

1.3 實現代碼

/***************************************************************************** Author: 唐維康 Date: 2020年10月05日 Code: UNICODE description: 守護進程:查看下載+轉換+維護三個程序是否因為某種原因死掉,如果死掉就重啟它 開發環境: Visual Studio 2017 Enterprise 和 Windows10專業版使用說明: PROCCESS_NAME_DOWMLOADWGET守護進程名稱根據需要守護的進程修改;twkWindowName_DownloadWget 是需要守護的程序的絕對路徑PROCCESS_NAME_MAINTENANCEPROCEDURES是需要守護的程序所在的路徑 一般情況和本程序在同一目錄 ************************************************************************/#include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <io.h> #include <iostream> #include <tchar.h>//參考網站 //https://blog.csdn.net/jelly_chen_zo/article/details/21546245?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242 //https://blog.csdn.net/u013408061/article/details/53314327//使用這個 TEXT 宏就可以使得程序都可以正常使用 //TEXT使路徑成為Unicode字符串 必須為LPCTSTR格式,強制類型轉換不行 //下面三個定義為是需要守護的程序的絕對路徑 LPCTSTR twkWindowName_DownloadWget = TEXT("D:\\Desktop\\Monitor_TangWeiKang\\UpgradedMonitoringMachine_TangWeiKang\\RecordingSeparation\\code\\MP3Conversion\\Daemon\\Test01.exe"); LPCTSTR twkWindowName_MP3Conversion = TEXT("D:\\Desktop\\Monitor_TangWeiKang\\UpgradedMonitoringMachine_TangWeiKang\\RecordingSeparation\\code\\MP3Conversion\\Daemon\\Test02.exe"); LPCTSTR twkWindowName_MaintenanceProcedures = TEXT("D:\\Desktop\\Monitor_TangWeiKang\\UpgradedMonitoringMachine_TangWeiKang\\RecordingSeparation\\code\\MP3Conversion\\Daemon\\Test03.exe");//LPCTSTR szAppWindowName = L"D:\\Desktop\\Monitor_TangWeiKang\\UpgradedMonitoringMachine_TangWeiKang\\RecordingSeparation\\code\\MP3Conversion\\Daemon\\Test01.exe"; using namespace std;//隱藏DOS黑窗口 //#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )//定義路徑最大程度 #define MAX_PATH_NUM 4096//定義守護進程名稱 #define PROCCESS_NAME_DOWMLOADWGET "Test01.exe" #define PROCCESS_NAME_MP3CONVERSION "Test02.exe" #define PROCCESS_NAME_MAINTENANCEPROCEDURES "Test03.exe" //PROGRAMEPATH 是需要守護的程序所在的路徑 一般情況和本程序在同一目錄 #define PROGRAMEPATH "D:\\Desktop\\Monitor_TangWeiKang\\UpgradedMonitoringMachine_TangWeiKang\\RecordingSeparation\\code\\MP3Conversion\\Daemon"//定義寫入的注冊表路徑 #define SELFSTART_REGEDIT_PATH "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\"BOOL SetSelfStart();int main() {Notepad獲得守護的進程的句柄HWND handle = FindWindow(NULL, szAppWindowName);HWND handle = FindWindow(NULL, (LPCTSTR)"Notepad");//HWND handle = FindWindow(NULL, szAppWindowName);//if (handle != NULL)//{// /*MessageBox(NULL, TEXT("Application is already running"), szAppClassName, MB_ICONERROR);// ExitProcess(1);*/// cout << "該程序已經在運行了!" << endl;// continue;//}//else//{// cout << "沒有存在" << endl;//}//獲取程序完整名稱char pName[MAX_PATH_NUM] = { 0 };GetModuleFileNameA(NULL, pName, MAX_PATH_NUM);//twk測試/*cout << "***************" << endl;cout << pName << endl;cout << "***************" << endl;*///設置程序開機自啟動if (!SetSelfStart()){cout << "守護進程開機自啟動失敗" << endl;return -1;}else{cout << "守護進程開機自啟動成功" << endl;}STARTUPINFOA si;// 該結構用于指定新進程的主窗口特性//進程對象PROCESS_INFORMATION pi[3];//初始化ZeroMemory(&si, sizeof(si));si.cb = sizeof(si);ZeroMemory(&pi, sizeof(pi));//進程相關信息(句柄,標識)//獲取當前程序的路徑 不用GetCurrentDirectoryA函數獲取是因為開機讀取了其它路徑//開機讀取的路徑是 pPath=C:\Windows\system32\test02.exechar pPath_DownloadWget[MAX_PATH_NUM] = { 0 };//GetCurrentDirectoryA(MAX_PATH_NUM, pPath_DownloadWget);strcat(pPath_DownloadWget, PROGRAMEPATH);char pPath_MP3Conversion[MAX_PATH_NUM] = { 0 };//GetCurrentDirectoryA(MAX_PATH_NUM, pPath_MP3Conversion);strcat(pPath_MP3Conversion, PROGRAMEPATH);char pPath_MaintenanceProcedures[MAX_PATH_NUM] = { 0 };//GetCurrentDirectoryA(MAX_PATH_NUM, pPath_MaintenanceProcedures);strcat(pPath_MaintenanceProcedures, PROGRAMEPATH);//拼接需要守護的程序strcat(pPath_DownloadWget, "\\");strcat(pPath_DownloadWget, PROCCESS_NAME_DOWMLOADWGET);strcat(pPath_MP3Conversion, "\\");strcat(pPath_MP3Conversion, PROCCESS_NAME_MP3CONVERSION);strcat(pPath_MaintenanceProcedures, "\\");strcat(pPath_MaintenanceProcedures, PROCCESS_NAME_MAINTENANCEPROCEDURES);//cout << " pPath_MaintenanceProcedures="<<pPath_MaintenanceProcedures << endl;//構造cmd執行守護進程的字符串char pCmd_DownloadWget[MAX_PATH_NUM] = { 0 };strcat(pCmd_DownloadWget,"cmd /c ");strcat(pCmd_DownloadWget, pPath_DownloadWget);char pCmd_MP3Conversion[MAX_PATH_NUM] = { 0 };strcat(pCmd_MP3Conversion, "cmd /c ");strcat(pCmd_MP3Conversion, pPath_MP3Conversion);char pCmd_MaintenanceProcedures[MAX_PATH_NUM] = { 0 };strcat(pCmd_MaintenanceProcedures, "cmd /c ");strcat(pCmd_MaintenanceProcedures, pPath_MaintenanceProcedures);//twk測試//cout << "pPath_DownloadWget=" << pPath_DownloadWget << endl;//char twkWindowName[MAX_PATH_NUM] = { 0 };//strcat(twkWindowName, pPath_DownloadWget);//LPCTSTR *twkWindowName = (LPCTSTR *)malloc(4096 * sizeof(LPCTSTR));//sprintf(twkWindowName,"%s", (LPCTSTR)pPath_DownloadWget);//cout << "twkWindowName=" << twkWindowName.c_str() << endl;//cout << "szAppWindowName"<<szAppWindowName << endl;//無限循環,監視守護進程do {//檢查守護程序是否存在if ((_access(pPath_DownloadWget, 0) != -1)|| (_access(pPath_MP3Conversion, 0) != -1)|| (_access(pPath_MaintenanceProcedures, 0) != -1)){//獲得守護的進程的句柄//HWND handle = FindWindow(NULL, szAppWindowName);//HWND handle = FindWindow(NULL, (LPCTSTR)"Notepad");HWND handle_DownloadWget = FindWindow(NULL, twkWindowName_DownloadWget);//HWND handle = FindWindow(NULL, (LPCWSTR)pPath_DownloadWget);if (handle_DownloadWget != NULL){/*MessageBox(NULL, TEXT("Application is already running"), szAppClassName, MB_ICONERROR);ExitProcess(1);*/cout << "守護的程序DownloadWget正在運行!" << endl;}else{if (!CreateProcessA(NULL, pCmd_DownloadWget, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi[0])){cout << "守護進程DownloadWget啟動失敗,程序即將退出" << endl;return -1;}}HWND handle_MP3Conversion = FindWindow(NULL, twkWindowName_MP3Conversion);//HWND handle = FindWindow(NULL, (LPCWSTR)pPath_DownloadWget);if (handle_MP3Conversion != NULL){/*MessageBox(NULL, TEXT("Application is already running"), szAppClassName, MB_ICONERROR);ExitProcess(1);*/cout << "守護的程序MP3Conversion正在運行!" << endl;}else{if (!CreateProcessA(NULL, pCmd_MP3Conversion, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi[0])){cout << "守護進程MP3Conversion啟動失敗,程序即將退出" << endl;return -1;}}HWND handle_MaintenanceProcedures = FindWindow(NULL, twkWindowName_MaintenanceProcedures);//HWND handle = FindWindow(NULL, (LPCWSTR)pPath_DownloadWget);if (handle_MaintenanceProcedures != NULL){/*MessageBox(NULL, TEXT("Application is already running"), szAppClassName, MB_ICONERROR);ExitProcess(1);*/cout << "守護的程序MaintenanceProcedures正在運行!" << endl;}else{if (!CreateProcessA(NULL, pCmd_MaintenanceProcedures, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi[0])){cout << "守護進程MaintenanceProcedures啟動失敗,程序即將退出" << endl;//continue;return -1;}}for (int i = 0; i < 3; i++){//啟動成功,獲取進程的IDcout << "守護進程成功,ID:" << pi[i].dwProcessId << endl;//無限等待子進程退出WaitForSingleObject(pi[i].hProcess, INFINITE);cout << "守護進程退出了。。。" << endl;//關閉進程和句柄CloseHandle(pi[i].hProcess);CloseHandle(pi[i].hThread);}}else{cout << "守護程序不存在" << endl;}//睡一下,重啟Sleep(2000);//int a;//a = CreateProcessA(NULL, (LPSTR)"Test01.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi[0]);//a = CreateProcessA(NULL, (LPSTR)"Test02.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi[1]);//a = CreateProcessA(NULL, (LPSTR)"Test03.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi[2]);// //終止線程for (int i = 0; i < 3; i++){OpenProcess(NULL, true, pi[i].dwProcessId);DWORD fuExitCode; // 進程的退出碼GetExitCodeProcess(pi[i].hProcess, &fuExitCode); // 獲得進程的退出碼TerminateProcess(pi[i].hProcess, fuExitCode); // 終止進程CloseHandle(pi[i].hThread);CloseHandle(pi[i].hProcess);}} while (true);return 0; }//設置本身開機自啟動 BOOL SetSelfStart() {//獲取程序完整名稱char pName[MAX_PATH_NUM] = { 0 };GetModuleFileNameA(NULL, pName, MAX_PATH_NUM);//在注冊表中寫入啟動信息HKEY hKey = NULL;LONG lRet = 0;lRet = RegOpenKeyExA(HKEY_CURRENT_USER, SELFSTART_REGEDIT_PATH, 0, KEY_ALL_ACCESS, &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; }// 取消開機自動啟動 void cancelAutoStart() {HKEY hKey;string strRegPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";//1、找到系統的啟動項 if (RegOpenKeyEx(HKEY_CURRENT_USER, (LPCTSTR)strRegPath.c_str(), 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS){//2、刪除值RegDeleteValue(hKey, (LPCTSTR)"GISRestart");//3、關閉注冊表RegCloseKey(hKey);} }

1.4 結果顯示

我用了三個程序來測試,Test01.exe Test02.exe Test03.exe 都是循環打印該進程PID,并且與守護程序放在了同一目錄。

開機啟動測試

界面顯示系統開機程序也跟隨開機。

重啟程序測試

當守護程序宕掉,2秒后重啟。

存在檢查

如果有一個守護的程序已經運行了,就不需要管。

我們手動運行Test01.exe。界面顯示Test01.exe跳過,它已經存在了。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的windows下的守护进程C++的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩大尺度视频 | 国产一级久久久久毛片精品 | 久久午夜鲁丝片午夜精品 | 日批在线视频 | tube国产麻豆 | 黄页网站免费在线观看 | 国产福利91 | 毛片123| 日本熟妇一区二区 | 国产97免费视频 | jzzijzzij亚洲成熟少妇在线观看 久久久精品人妻一区二区三区 | 桃色视频在线 | 伊人影院99 | 伊人激情综合网 | 亚洲午夜一区二区三区 | 女的被男的操 | 久色精品| 国产成人精品一区二区三区在线观看 | 国产欧美日韩综合精品一区二区三区 | 91香蕉视频黄 | 美女被揉胸视频 | 天天色天 | 国产农村妇女精品一区 | 亚洲欧美电影 | 久久婷婷热 | 超碰人人人 | 亚洲在线观看一区 | 日韩视频一 | 色婷婷国产精品久久包臀 | 精品国产一区二区三区性色av | 蜜桃导航-精品导航 | 国产性生活片 | 久久精品一二三 | 亚洲国产成人精品久久久 | 荷兰av | 午夜伦理在线观看 | 91精品婷婷国产综合久久 | 成人动漫在线观看视频 | 国产调教一区 | 欧美xxxbbb| 免费观看的av| 天天天天操| 农村少妇无套内谢粗又长 | 香蕉视频免费在线看 | 欧美日韩中文字幕在线观看 | 不卡的av在线免费观看 | a在线免费观看 | 少妇日b| 国产123 | a v视频在线观看 | a级淫片| 色婷婷一区二区三区四区 | 欧美日韩免费高清一区色橹橹 | 欧美一区二区三区小说 | 欧美13p | 国产精选中文字幕 | 99精品福利 | 他揉捏她两乳不停呻吟动态图 | 日韩激情视频一区二区 | 善良的公与媳hd中文字 | 精品视频免费看 | 男人天堂电影 | 色多多网站 | 色综合久久久久久 | 国产亚洲视频在线观看 | 亚洲国产成人综合 | 青青草手机在线视频 | 在线视频a | 欧美一区二区激情视频 | 伊人艹 | 日韩精品成人在线 | 亚洲乱码国产乱码精品精 | a天堂v| 成人av免费观看 | 日本大胆人体视频 | 无码人妻精品一区二区三区66 | 国产精品美女一区二区 | 韩国美女福利视频 | 久久久久久免费视频 | 懂色av懂色av粉嫩av分享吧 | wwwxxx国产| 操bbbbb | 国产日韩欧美精品在线 | 日韩精品久久久久久久酒店 | 亚洲成人精品在线播放 | 日本三级在线视频 | 国产无遮挡一区二区三区毛片日本 | 成人1区2区 | 永久免费成人代码 | 成人涩涩视频 | 欧美手机在线观看 | 黄色一级片在线免费观看 | 人妻少妇精品视频一区二区三区 | 影音先锋三级 | 日本男人的天堂 | 欧美性动态图 | 清冷男神被c的合不拢腿男男 | 欧美久久久久久久久 | 狠狠操狠狠插 |