⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 poll_main.c

📁 一个C程序
💻 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 + -