进程看门狗

   写了个进程监控的东西 。。。。。可以监控多个进程  如果一个进程 挂了 就会重新启动之。。。

#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;
}

转载于:https://my.oschina.net/sincoder/blog/119503

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值