进程A为主进程,进程B为守护进程,例如:通过一个事件event,判断进程A是否存在,若存在,无动作,若不存在,则启动进程A;


进程树把两个进程同时杀死。



双进程守护的思想:


        假设我想保护A进程,不想被别人结束掉。比如通过进程管理器等方式。


        那么就建立一个后台监视进程B,判断A进程是否还存在,如果被杀死,那就重新建立一个A进程。


        当然,你也许会说,我可以把B先结束掉,在杀死A。所以A进程也需要监视B进程,发现B被杀死,就创建一个B。



        所以双进程守护的两个关键就出现了,


        (1)进程持续运行(因为需要监视,所以,要一直运行。)


        (2)如何实现进程间的相互监视!


第一点比较容易实现,只要创建一个死循环就好,注意循环中加入sleep(n)很重要,减少资源占用。


第二点比较麻烦,一个进程被杀死,另一个进程必须马上直到他被杀,然后才可以启动它。其实就是进程间的通信,这个有好多方法实现。


我们采用创建事件event的方式来达到目的。


A进程启动的时候CreateEvent(NULL, NULL, FALSE, TEXT("EVENT1"));


B进程启动的时候CreateEvent(NULL, NULL, FALSE, TEXT("EVENT2"));


在A进程中的死循环(while(true))中,加入检测代码


while (true)
 
 {
 
  hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("EVENT2"));
 
  if (!hEvent)  
 
  {
 
   CreateProcess(NULL, szCommandLine, NULL, NULL, FALSE, NULL, NULL, NULL, &si1, &pi1);//创建进程Test2.exe
 

 
   WaitForSingleObject(pi1.hProcess, INFINITE);
 
   CloseHandle(pi1.hProcess);
 
   CloseHandle(pi1.hThread);
 
  }
 
  else
 
  {
 
   CloseHandle(hEvent);
 
  }
 
  Sleep(100);
 
 }

用 OpenEvent,若打开成功,返回句柄,则证明进程B存在,因为进程B被杀死后,EVENT2会被删除,导致open失败。



进程B中也加入相似代码,以此达到双进程守护的目的。



但是一般这个方式可以通过结束进程树的方式结束程序,可能因为是父子进程的关系。


所以我们创建临时进程,使这两个进程脱离父子进程的关系。


如A创建temA,temA创建B,然后temA任务完成,自动结束。


B创建A时同理。