您的位置:首页 > 其它

进程防杀——双进程守护

2015-08-14 15:37 447 查看
进程A为主进程,进程B为守护进程,例如:通过一个事件event,判断进程A是否存在,若存在,无动作,若不存在,则启动进程A;
B—>启动临时进程—>启动进程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);
 }

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

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

但是一般这个方式可以通过结束进程树的方式结束程序,可能因为是父子进程的关系。
所以我们创建临时进程,使这两个进程脱离父子进程的关系。
如A创建temA,temA创建B,然后temA任务完成,自动结束。
B创建A时同理。

代码下载: http://download.csdn.net/detail/walker34/9005473
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息