/************************************************* File name: cstamain.c Author: JianHui Zheng Version: 9:00:00 Date: 2007-7-2 Description:cstaCollector模块的main文件,该文件可以使模块独立运行 调用外部函数 void iptrans_init(); void snmp_init(int port); 调用csta.c文件函数 void csta_init(); History: No. Author Date Version Description *************************************************/ #include #include #include #include #include #include "csta.h" static struct itimerval itimer, old_itimer; void onCstaCollectorTimer(); void setCstaCollectorTimer(); void setup_daemon(void); int timerCounter = 0; /************************************************* Function: // main Description: // main函数,可以使模块独立运行 Calls: // iptrans_init; snmp_init; csta_init; setCstaCollectorTimer; Called By: // csta.c:csta_init; Table Accessed: // Table Updated: // Input: // int argc, char *argv[] Output: // Return: // Others: // *************************************************/ int main(int argc, char *argv[]) { char runMode; runMode = getopt(argc, argv, "d"); //获取运行参数 switch (runMode) { case 'd': setup_daemon(); break; case '?': break; } //IP平台模块初始化 fprintf(stderr, "\n Calling iptrans_init() \n"); iptrans_init(); //snmp模块初始化 fprintf(stderr, "\n Calling snmp_init() \n"); snmp_init(4957); //cstaCollector模块初始化 fprintf(stderr, "\n Calling csta_init() \n"); csta_init(); //设定定时器 setCstaCollectorTimer(); while (1) { usleep(50); } return (1); } /************************************************* Function: // onCstaCollectorTimer Description: // 设定定时器函数 Calls: // csta_timer; Called By: // setCstaCollectorTimer; Table Accessed: // Table Updated: // Input: // int argc; char *argv[]; Output: // Return: // Others: // *************************************************/ void onCstaCollectorTimer() { csta_timer(); } /************************************************* Function: // setCstaCollectorTimer Description: // 开启定时器函数 Calls: // setitimer; Called By: // main; Table Accessed: // Table Updated: // Input: // Output: // Return: // Others: // *************************************************/ void setCstaCollectorTimer() { struct sigaction act; act.sa_handler = onCstaCollectorTimer; sigemptyset(&act.sa_mask); act.sa_flags = 0; if (sigaction(SIGALRM, &act, NULL) < 0) { perror("Produce Sigaction"); exitLog("cstaCollector:setCstaCollectorTimer, sigaction function error"); exit(1); } itimer.it_interval.tv_sec = 0; itimer.it_interval.tv_usec = 10 * 1000; itimer.it_value.tv_sec = 0; itimer.it_value.tv_usec = 10 * 1000; if (setitimer(ITIMER_REAL, &itimer, &old_itimer) != 0) { printf("Setting Timer error! \n"); exitLog("cstaCollector:setCstaCollectorTimer, setitimer function error"); exit(1); } } /************************************************* Function: // setup_daemon Description: // 将程序设为后台进程 Calls: // fork; Called By: // main; Table Accessed: // Table Updated: // Input: // Output: // Return: // Others: // *************************************************/ void setup_daemon(void) { //复制进程 switch (fork()) { case -1: { perror("setup_daemon(), 1st fork()"); exit(2); } default: exit(0); case 0: if (setsid() == -1) { perror("setup_daemon(), setsid()"); exit(3); } switch (fork()) { case -1: { perror("setup_daemon(), 2nd fork()"); exit(3); } default: exit(0); case 0: umask(0); /* and return with daemon set up */ return; } } }