windows下,如何用C++编写守护进程

C++进程监控与重启

写一个C++程序,监控另一个进程,

发现该进程关掉了就自动把它重启。

 

 

include 
#include 
#include 
#include

using namespace std;

int _tmain(int argc, TCHAR *argv[]) 
{ 
 STARTUPINFO si;
 
    PROCESS_INFORMATION pi; //
进程信息:

    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 
 do{
  //
创建子进程,判断是否执行成功
  if(!CreateProcess( NULL,"cmd /c d://1.jpg",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
  {
   cout << "
创建进程失败.." << GetLastError() << endl;
   system("pause"); //
用于测试
   return 0; 
  } 
  //
进程执行成功,打印进程信息 
  cout << "
以下是子进程的信息:" << endl;
  cout << "
进程ID pi.dwProcessID: " << pi.dwProcessId << endl;
  cout << "
线程ID pi.dwThreadID : " << pi.dwThreadId << endl;
  //
等待知道子进程退出... 
  WaitForSingleObject( pi.hProcess, INFINITE);//
检测进程是否停止 
  //WaitForSingleObject()
函数检查对象的状态,如果是未确定的则等待至超时 
  //
子进程退出 
  cout << "
子进程已经退出..." << endl;
  //
关闭进程和句柄 
  CloseHandle(pi.hProcess); 
  CloseHandle(pi.hThread);
  //system("pause");//
执行完毕后等待
 }while(true);//
如果进程推出就再次执行方法 
    exit(0); 
 return 0;
}

 

### 如何在 Windows 上使用 C++ 创建守护进程 #### 守护进程的概念 守护进程是一种运行于后台的服务程序,在操作系统启动时自动加载并持续运行直到关闭。这类进程通常用于执行特定的任务而无需用户交互。 #### 实现方式概述 为了实现守护进程的功能,可以考虑利用Windows服务机制来代替传统的Unix/Linux下的守护进程概念。通过编写一个Windows服务应用程序,能够达到相似的效果——即该应用可以在系统引导期间自启,并保持长时间稳定运行而不依赖任何图形界面或用户的登录状态。 #### 编写 Windows 服务的具体步骤如下: 1. **定义服务控制处理函数** 此函数负责响应来自Service Control Manager (SCM) 的各种命令请求,比如停止、暂停等操作。 ```cpp void WINAPI ServiceCtrlHandler(DWORD controlCode); ``` 2. **注册服务主控句柄表项** 向 SCM 注册当前进程中所管理的一个或多个服务实例的信息结构体数组。 ```cpp SERVICE_TABLE_ENTRYW serviceTable[] = { { L"MyDaemonProcess", (LPSERVICE_MAIN_FUNCTIONW)ServiceMain }, { NULL, NULL } }; ``` 3. **初始化工作线程入口点** 当服务被成功安装并且由 SCM 启动之后会调用这个回调方法作为其主要逻辑起点。 ```cpp void WINAPI ServiceMain(DWORD argc, LPWSTR* argv); ``` 4. **设置服务状态信息对象** 用来通知 SCM 关于此服务的状态变化情况,例如正在启动、已经就绪等待指令输入等等。 ```cpp static SERVICE_STATUS_HANDLE hStatus; static void SetServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode = NO_ERROR, DWORD dwWaitHint = 0) { static DWORD dwCheckPoint = 1; SERVICE_STATUS ssSvcStat; ZeroMemory(&ssSvcStat, sizeof(ssSvcStat)); ssSvcStat.dwServiceType = SERVICE_WIN32_OWN_PROCESS; ssSvcStat.dwCurrentState = dwCurrentState; ssSvcStat.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; ssSvcStat.dwWin32ExitCode = dwWin32ExitCode; ssSvcStat.dwServiceSpecificExitCode = 0; ssSvcStat.dwCheckPoint = dwCheckPoint++; ssSvcStat.dwWaitHint = dwWaitHint; SetServiceStatus(hStatus,&ssSvcStat); } ``` 5. **实际业务功能模块设计** 这部分包含了开发者希望守护进程完成的核心任务代码部分;需要注意的是这里不应该包含任何形式的人机交互组件(GUI窗口),因为这违背了守护进程的设计初衷。 6. **编译链接成可执行文件** 7. **使用 `sc` 命令行工具进行服务的安装与配置** ```bash sc create MyDaemonProcess binPath= "C:\path\to\your_service_executable.exe" ``` 8. **最后一步就是启动新建立好的服务啦** 可以通过计算机管理器中的“服务”选项卡找到对应名称的服务条目右键点击选择“启动”。 以上就是在 Windows 平台上基于 C++ 开发守护进程的一种常见做法[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值