📄 monitor3.c
字号:
#include <comlib.h>#include <dlfcn.h>typedef int (*PFUNC)(char*); typedef struct stuSimTimer{ char szHost[20]; /* 主机名称 */ int nInterval; /* 定时间隔,取值为0时表示取消定时 */ time_t nLast; /* 上一次定时的系统时间 */ int nRemain; /* 剩余定时时间 */ char szFile[50]; /* 文件名称 */ char szFunc[30]; /* 监控函数名称 */ int nFast; /* 快速调用标志 */ void *pHandle; /* 动态库句柄 */ PFUNC pFunc; /* 监控函数 */} SIMTIMER;typedef SIMTIMER * PSIMTIMER;#define MAXTIMER 20SIMTIMER sTimer[MAXTIMER];int nTopTimer = 0; int msgid;int GetConfig(){ int nNumber, i; char buf[20]; ASSERT(GetConfigValue("./config.ini", "EXEC", "NUMBER", &nNumber, STRINT) == 0); /* 获取监控代码的个数 */ for (i=0; i<nNumber; i++) { sprintf(buf, "EXEC%d", i+1); /* 监控代码项 */ ASSERT(GetConfigValue("./config.ini", buf, "NAME", sTimer[i].szHost, STRSTR) == 0); /* 监控主机名称 */ ASSERT(GetConfigValue("./config.ini", buf, "INTERVAL", &(sTimer[i].nInterval), STRINT) == 0); /* 监控代码执行间隔 */ ASSERT(GetConfigValue("./config.ini", buf, "FILE", sTimer[i].szFile, STRSTR) == 0); /* 监控代码所在DLL名称 */ sTimer[i].nLast = 0; sTimer[i].nRemain = 0; } nTopTimer = i; return 0;} int GetPort(){ char szAddr[30]; int nPort; int nSock; struct sockaddr_in addrin; ASSERT(GetConfigValue("./config.ini", "REMOTE", "IP", szAddr, STRSTR) == 0); ASSERT(GetConfigValue("./config.ini", "REMOTE", "PORT", &nPort, STRINT) == 0); /* 创建UDP套接字描述符 */ ASSERT((nSock = socket(AF_INET, SOCK_DGRAM, 0)) > 0); memset(&addrin, 0, sizeof(struct sockaddr)); addrin.sin_family = AF_INET; /* 协议名 */ addrin.sin_addr.s_addr = inet_addr(szAddr); /* 接收方的地址 */ addrin.sin_port = htons(nPort); /* 接收方的服务端口号 */ ASSERT(connect(nSock, (struct sockaddr *)&addrin, sizeof(addrin)) >= 0); dup2(nSock, 1); return 0;}int FuncAlarm(SIMTIMER uTimer){ pid_t nChild; ASSERT((nChild = fork()) >= 0); /* 创建子进程 */ if (nChild > 0) return 0; /* 父进程退出 */ /* -------------------以下是子进程-------------------- */ /* 调用监控程序 */ execl(uTimer.szFile, uTimer.szFile, uTimer.szHost, 0); exit(0);}void timefunc(int sig) /* 基本定时器响应函数 */{ int i; /* 模拟定时器算法 */ for (i=0; i<nTopTimer; i++) /* 遍历模拟定时器数组 */ { sTimer[i].nRemain--; /* 定时剩余时间减1 */ if (sTimer[i].nRemain <= 0) /* 模拟定时器定时到达 */ { WriteMsg(msgid, sTimer+i, sizeof(SIMTIMER), i+1); sTimer[i].nRemain = sTimer[i].nInterval; /* 重置模拟定时器 */ } } signal(SIGALRM, timefunc); /* 再次设置捕获定时信号 */ alarm(1); /* 基本定时器再次定时 */}int GetMsg(){ int msgkey; ASSERT(GetConfigValue("./config.ini", "LOCAL", "MSG", &msgkey, STRINT) == 0); /* 读取消息队列关键字 */ ASSERT((msgid = msgget(msgkey, 0666|IPC_CREAT)) > 0); return 0; }int main(){ int nSize, nType; SIMTIMER sTimer1; ASSERT(GetConfig() == 0); /* 获取监控代码信息 */ ASSERT(GetPort() == 0); /* 创建UDP套接字,输出重定向 */ ASSERT(GetMsg() == 0); /* 打开消息队列 */ ASSERT(InitServer() == 0); /* 主机进程转后台执行 */ signal(SIGALRM, timefunc); ASSERT(signal(SIGCLD, SIG_IGN) != SIG_ERR); /* 预防僵死进程 */ alarm(1); /* 基本定时器首次定时 */ while(1) /* 主进程保持运行、不退出的状态 */ { memset(&sTimer1, 0, sizeof(sTimer1)); nSize = sizeof(sTimer1); nType = 0; ASSERT(ReadMsg(msgid, &sTimer1, &nSize, &nType) == 0); FuncAlarm(sTimer1); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -