进程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时同理。