📄 poll_main.c
字号:
/*****************************************************************************
* 包含头文件
*****************************************************************************/
#include "emv_global.h"
#include "emv_dbfunc.h"
#include "server_info.h"
#include "listen_thread.h"
#include "poll_main.h"
/*****************************************************************************
* 类型定义
*****************************************************************************/
/*****************************************************************************
* 宏定义
*****************************************************************************/
/*****************************************************************************
*全局变量
*****************************************************************************/
int giRunStatus = STARTING;
char gsProgramName[256] = "\0";
int poll_interval = 60;
int community_update_interval = 4600;
int snmpversion_update_interval = 5600;
int circuit_update_interval = 3600;
int scope_update_interval = 6600;
/*****************************************************************************
* 内部函数
*****************************************************************************/
static int setup_sig_handlers(void);
static void sig_handler(int signo);
static int init_cfg_file();
/*****************************************************************************
*
* main函数.
*
* @param argc main函数参数个数.
* @param argv main函数参数指针.
*
* @return 若成功,返回0;否则,返回-1.
*
*****************************************************************************/
int main(int argc, char *argv[])
{
char sLogFileName[256] = "\0";
int iRetCode = 0;
memset(gsProgramName, 0, sizeof(gsProgramName));
strncpy(gsProgramName, basename(argv[0]), sizeof(gsProgramName)-1);
snprintf(sLogFileName, sizeof(sLogFileName), "%s.log", gsProgramName);
init_debug_status(gsProgramName);
emv_log_file(sLogFileName);
emv_info("主程序启动");
if (argc < 2) {
printf("用法: %s <平台IP>\n", gsProgramName);
exit(1);
}
clean_meminit();
setup_sig_handlers();
if (init_cfg_file() < 0){
emv_error("读配置文件出错, 使用默认配置项");
}
/* 检查传入平台IP的有效性 */
iRetCode = is_valid_ipstr(argv[1]);
if (iRetCode <= 0) {
emv_error("不合法的平台IP地址: %s", argv[1]);
exit(1);
}
/* 获取数据库句柄*/
giDbHandle1 = get_db_connection();
if (giDbHandle1 < 0) {
emv_error("get_db_connection failed");
exit(1);
}
emv_debug("giDbHandle1[%d]", giDbHandle1);
giDbHandle2 = get_db_connection();
if (giDbHandle2 < 0) {
emv_error("get_db_connection failed");
exit(1);
}
emv_debug("giDbHandle2[%d]", giDbHandle2);
giDbType = emv_db_type(giDbHandle1);
emv_debug("giDbType[%d]", giDbType);
/* 获得平台服务信息 */
set_major_flag(1);
iRetCode = init_server_info(argv[1]);
if (iRetCode < 0) {
emv_error("init_server_info failed(平台IP: %s)", argv[1]);
exit(1);
}
dump_server_info();
/* 初始化udp监听端口 */
iRetCode = init_udp_server();
if (iRetCode < 0) {
emv_error("init_udp_server failed");
exit(1);
}
/* 启动消息发送线程 */
iRetCode = start_send_thread();
if (iRetCode < 0) {
emv_error("start_send_thread failed");
exit(1);
}
/* 启动消息接收线程 */
iRetCode = start_listen_thread();
if (iRetCode < 0) {
emv_error("start_listen_thread failed");
exit(1);
}
while (giRunStatus != STOPPING) {
sleep(3600);
}
emv_info("主程序终止");
return 0;
}
/*****************************************************************************
*
* 信号处理函数.
*
* @param .
*
* @return 若成功,返回0;否则,返回-1.
*
*****************************************************************************/
static int setup_sig_handlers(void)
{
struct sigaction act;
act.sa_handler = sig_handler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGTERM,&act,NULL);
sigaction(SIGINT, &act, NULL);
sigaction(SIGHUP, &act, NULL);
sigaction(SIGUSR1,&act,NULL);
sigaction(SIGUSR2,&act,NULL);
sigaction(SIGPIPE, &act, NULL);
//sigaction(SIGALRM,&act,NULL);
return 0;
}
/*****************************************************************************
*
* 信号处理函数.
*
* @param signo 信号编号.
*
* @return .
*
*****************************************************************************/
static void sig_handler(int signo)
{
switch (signo) {
case SIGTERM:
case SIGINT:
emv_info("received SIGTERM or SIGINT(tid:%d)", pthread_self());
exit(1);
break;
case SIGHUP:
emv_info("received SIGHUP(tid:%d)", pthread_self());
switch_debug_status();
break;
case SIGUSR1:
emv_info("received SIGUSR1(tid:%d)", pthread_self());
break;
case SIGUSR2:
emv_info("received SIGUSR2(tid:%d)", pthread_self());
#ifdef MEMORY_LEAK
dump_mem_leak();
#endif
break;
#if 0
case SIGALRM:
emv_info("received SIGALRM(tid:%d)", pthread_self());
break;
#endif
case SIGPIPE:
emv_info("received SIGPIPE(tid:%d)", pthread_self());
break;
default:
emv_info("received signal %d(tid:%d)", signo, pthread_self());
break;
}
}
/* 读取conf配置文件信息 */
static int init_cfg_file()
{
int handle = -1;
char* cfg_file = "arp_poll.conf";
char poll_interval_string[32];
char community_update_interval_string[32];
char snmpversion_update_interval_string[32];
char circuit_update_interval_string[32];
char scope_update_interval_string[32];
memset(poll_interval_string,0,sizeof(poll_interval_string));
memset(community_update_interval_string,0,sizeof(community_update_interval_string));
memset(snmpversion_update_interval_string,0,sizeof(snmpversion_update_interval_string));
memset(circuit_update_interval_string,0,sizeof(circuit_update_interval_string));
memset(scope_update_interval_string,0,sizeof(scope_update_interval_string));
if((handle = emv_conf_open(cfg_file,0)) < 0){
emv_error("打开配置文件%s失败",cfg_file);
return -1;
}
if((emv_conf_getvalue(handle,"","POLL_INTERVAL",poll_interval_string,sizeof(poll_interval_string))) < 0){
emv_error("读取配置文件%s节点POLL_INTERVAL失败",cfg_file);
emv_conf_close(handle);
return -1;
}
else
poll_interval = atoi(poll_interval_string);
if((emv_conf_getvalue(handle,"","COMMUNITY_UPDATE_INTERVAL",community_update_interval_string,sizeof(community_update_interval_string))) < 0){
emv_error("读取配置文件%s节点COMMUNITY_UPDATE_INTERVAL失败",cfg_file);
emv_conf_close(handle);
return -1;
}
else
community_update_interval = atoi(community_update_interval_string);
if((emv_conf_getvalue(handle,"","SNMPVERSION_UPDATE_INTERVAL",snmpversion_update_interval_string,sizeof(snmpversion_update_interval_string))) < 0){
emv_error("读取配置文件%s节点SNMPVERSION_UPDATE_INTERVAL失败",cfg_file);
emv_conf_close(handle);
return -1;
}
else
snmpversion_update_interval = atoi(snmpversion_update_interval_string);
if((emv_conf_getvalue(handle,"","CIRCUIT_UPDATE_INTERVAL",circuit_update_interval_string,sizeof(circuit_update_interval_string))) < 0){
emv_error("读取配置文件%s节点CIRCUIT_UPDATE_INTERVAL失败",cfg_file);
emv_conf_close(handle);
return -1;
}
else
circuit_update_interval = atoi(circuit_update_interval_string);
if((emv_conf_getvalue(handle,"","SCOPE_UPDATE_INTERVAL",scope_update_interval_string,sizeof(scope_update_interval_string))) < 0){
emv_error("读取配置文件%s节点SCOPE_UPDATE_INTERVAL失败",cfg_file);
emv_conf_close(handle);
return -1;
}
else
scope_update_interval = atoi(scope_update_interval_string);
emv_conf_close(handle);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -