写了个进程监控的东西 。。。。。可以监控多个进程 如果一个进程 挂了 就会重新启动之。。。
#include <Windows.h>
#include <stdio.h>
typedef struct _process_context
{
HANDLE hProcess;
char *pCmdLine;
}process_context;
#define dbg_msg(fmt,...) do { \
printf(##__FUNCTION__##":"fmt,__VA_ARGS__); \
} while (0)
HANDLE MyExec(char *cmd)
{
STARTUPINFOA si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if (!CreateProcessA(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
dbg_msg("create process %s failed %d\n",cmd,GetLastError());
pi.hProcess = NULL;
}
else
{
CloseHandle(pi.hThread);
}
return pi.hProcess;
}
/*
随便找一个API 来测试 进程的有效性
*/
BOOL isProcessRun(HANDLE hProcess)
{
DWORD ret = WaitForSingleObject(hProcess,0);
switch(ret)
{
case WAIT_FAILED:
case WAIT_OBJECT_0:
return FALSE;
case WAIT_TIMEOUT:
case WAIT_ABANDONED:
default:
break;
}
return TRUE;
}
int main(int argc,char **argv)
{
process_context * pProcessTable = NULL; //句柄表
int iCount = 0; //句柄数量
int idx = 0;
if(argc < 2)
{
printf("Usage:watch_dog [程序1] [程序2] 。。。\n");
return -1;
}
iCount = argc - 1;
pProcessTable = (process_context *)malloc(iCount * sizeof(process_context));
ZeroMemory(pProcessTable,iCount * sizeof(process_context));
//启动 所有的进程
for (;idx < iCount;idx++)
{
HANDLE hProcess = NULL;
char *pCmd = argv[idx + 1];
hProcess = MyExec(pCmd);
if(hProcess)
{
printf("Create Process %s OK ! \n",pCmd);
pProcessTable[idx].pCmdLine = _strdup(pCmd);
}
pProcessTable[idx].hProcess = hProcess;
}
//循环 看看是不是 有进程退出了
while(1)
{
for (idx = 0;idx < iCount;idx++)
{
if(pProcessTable[idx].hProcess)
{
//检测是不是 退出了。 。。
if(!isProcessRun(pProcessTable[idx].hProcess))
{
HANDLE hprocess;
dbg_msg("process %s had exited ....\n",pProcessTable[idx].pCmdLine);
//重新启动进程。。。
hprocess = MyExec(pProcessTable[idx].pCmdLine);
if(hprocess)
{
pProcessTable[idx].hProcess = hprocess;
}
else
{
dbg_msg("重新启动进程 %s 失败 \n",pProcessTable[idx].pCmdLine);
// 不删除 相关的 进程 信息 循环的重新启动 。。。
}
}
}
}
//休息下
Sleep(100);
}
//不会运行到这里的。。。资源就不释放了、、、
return 0;
}