int check_single() { int fd = -1; char buf[16] = {0}; fd = open(config_get_strval("pid_file", "./pid"), O_RDWR|O_CREAT, 0644); if (fd < 0) BOOT_LOG(-1, "check single failed"); struct flock fl; fl.l_type = F_WRLCK; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; fl.l_pid = getpid(); if (fcntl(fd, F_SETLK, &fl) < 0) { if (errno == EACCES || errno == EAGAIN) { close(fd); BOOT_LOG(-1, "service is running"); return -2; } BOOT_LOG(-1, "service is running"); } if (ftruncate(fd, 0) != 0) BOOT_LOG(-1, "check single failed"); snprintf(buf, sizeof(buf), "%d", (int)getpid()); if (write(fd, buf, strlen(buf)) == -1) BOOT_LOG(-1, "check single failed"); return 0; }
/** * @brief AsyncServer框架要求实现的接口之一。 * */ extern "C" int init_service(int isparent) { if (!isparent) { setup_timer(); init_all_timer_type(); init_funcs(); const char *udp_ip = get_server_ip(); uint16_t udp_port = get_server_port(); bind_udp_socket(udp_ip, udp_port); g_dirty_word = new Cdirty_word(); if (!g_dirty_word->is_inited) return -1; regist_timers(); if (load_xmlconf("../conf/GameSvr.xml", load_game_svr_config) == -1) return -1; max_msg_count = config_get_intval("max_msg_count", 1024); /* if(g_seg_mgr.init("../data/")) { BOOT_LOG(-1,"online udp listen:%s:%d %u",udp_ip, udp_port, max_msg_count); } */ BOOT_LOG(0,"online udp listen:%s:%d %u",udp_ip, udp_port, max_msg_count); } return 0; }
int load_profession_work(const char *file) { xmlDocPtr doc; xmlNodePtr cur, chl; int i, err = -1; int record_count = 1; doc = xmlParseFile (file); if (!doc) { ERROR_RETURN (("load profession work config failed"), -1); } cur = xmlDocGetRootElement(doc); if (!cur) { ERROR_LOG ("xmlDocGetRootElement error"); goto exit; } cur = cur->xmlChildrenNode; while (cur) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"Entry"))) { DECODE_XML_PROP_INT(i, cur, "ID"); if (record_count > MAX_RECORD || record_count != i) { ERROR_LOG ("parse %s failed, Count=%d, id=%d", file, record_count, i); goto exit; } work_config[i - 1].id = i; DECODE_XML_PROP_INT(work_config[i - 1].profession, cur, "PROFESSION"); if (work_config[i - 1].profession > 50) { ERROR_LOG ("parse %s failed, profession = %u", file, work_config[i].profession); goto exit; } DECODE_XML_PROP_INT(work_config[i - 1].level, cur, "LEVEL"); if (work_config[i - 1].level > 10) { ERROR_LOG ("parse %s failed, level=%d", file, work_config[i].level); goto exit; } DECODE_XML_PROP_INT(work_config[i - 1].vip, cur, "VIP"); if ((work_config[i - 1].vip != 0) && (work_config[i - 1].vip != 1)) { ERROR_LOG ("parse %s failed vip=%d", file, work_config[i].vip); goto exit; } chl = cur->xmlChildrenNode; if ((parse_profession_work_items(&work_config[record_count - 1], chl) != 0)) { goto exit; } record_count++; } cur = cur->next; } err = 0; exit: xmlFreeDoc (doc); BOOT_LOG (err, "Load profession work item file %s", file); }
int m_process_service_init() { init_timer(); my_read_conf(); multicast_init(); if (tm_load_dirty("./data/tm_dirty.dat") < 0) { BOOT_LOG(-1, " fail to laod dirty data"); } return 0; }
int el_async::bench_conf_t::load(const char* path_suf) { int ret = 0; this->file_ini.load(path_suf); if (0 != this->file_ini.get_val(this->liblogic_path, "plugin", "liblogic")){ BOOT_LOG(ERR, "[%s]plugin,liblogic", path_suf); return -1; } this->file_ini.get_val(this->max_fd_num, "common", "max_fd_num"); this->file_ini.get_val(this->is_daemon, "common", "is_daemon"); this->file_ini.get_val(this->fd_time_out, "common", "fd_time_out"); this->file_ini.get_val(this->page_size_max, "common", "page_size_max"); this->file_ini.get_val(this->listen_num, "common", "listen_num"); if (0 != this->file_ini.get_val(this->log_dir, "log", "dir")){ BOOT_LOG(ERR, "log,dir"); return -1; } this->file_ini.get_val(this->log_level, "log", "level"); this->file_ini.get_val(this->log_save_next_file_interval_min, "log", "save_next_file_interval_min"); this->file_ini.get_val(this->core_size, "core", "size"); this->file_ini.get_val(this->restart_cnt_max, "core", "restart_cnt_max"); this->file_ini.get_val(this->daemon_tcp_ip, "net", "daemon_tcp_ip"); this->file_ini.get_val(this->daemon_tcp_port, "net", "daemon_tcp_port"); this->file_ini.get_val(this->daemon_tcp_max_fd_num, "net", "daemon_tcp_max_fd_num"); this->file_ini.get_val(this->mcast_incoming_if, "multicast", "mcast_incoming_if"); this->file_ini.get_val(this->mcast_outgoing_if, "multicast", "mcast_outgoing_if"); this->file_ini.get_val(this->mcast_ip, "multicast", "mcast_ip"); this->file_ini.get_val(this->mcast_port, "multicast", "mcast_port"); this->file_ini.get_val(this->addr_mcast_incoming_if, "addr_multicast", "mcast_incoming_if"); this->file_ini.get_val(this->addr_mcast_outgoing_if, "addr_multicast", "mcast_outgoing_if"); this->file_ini.get_val(this->addr_mcast_ip, "addr_multicast", "mcast_ip"); this->file_ini.get_val(this->addr_mcast_port, "addr_multicast", "mcast_port"); return ret; }
int handle_init(int argc, char** argv, int pid_type) { switch (pid_type) { case PROC_MAIN: break; case PROC_WORK: pReg = new Cregdeal(); cpo = new Cclientproto(config_get_strval("dbproxy_ip"),config_get_intval ("dbproxy_port",0)); net = new CNetComm(config_get_strval("verify_ip"), config_get_intval("verify_port",0)); statfile = config_get_strval("statistic_logfile"); max_register_channel = config_get_intval("max_register_channel",0); if (pReg->get_no_count_ip() == -1) { BOOT_LOG(-1, "get no count ip wrong"); } break; case PROC_CONN: break; default: BOOT_LOG(-1, "Invalid pid_type=%d", pid_type); } return 0; }
int load_weekend_bonus(const char *file) { xmlDocPtr doc; xmlNodePtr cur, chl; int i, err = -1; int ex_count; ex_count = 0; memset(weekend_bonus, 0, sizeof (weekend_bonus)); doc = xmlParseFile (file); if (!doc) ERROR_RETURN (("load items config failed"), -1); cur = xmlDocGetRootElement(doc); if (!cur) { ERROR_LOG ("xmlDocGetRootElement error"); goto exit; } cur = cur->xmlChildrenNode; while (cur) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"Week"))) { DECODE_XML_PROP_INT(i, cur, "WeekID"); if (ex_count >= WEEKEND_BONUS_TABLE_SIZE - 1 || i <= 0) { ERROR_LOG ("parse %s failed, Count=%d, id=%d", file, ex_count, i); goto exit; } weekend_bonus[i].weekid = i; if (weekend_bonus[i].weekid > WEEKEND_BONUS_TABLE_SIZE - 1) { ERROR_LOG ("parse %s failed, Count=%d, weekid=%d", file, ex_count, weekend_bonus[i].weekid); goto exit; } chl = cur->xmlChildrenNode; if ( (parse_weekend_single_item(weekend_bonus[i].item, &(weekend_bonus[i].item_count), chl) != 0) ) goto exit; ex_count++; } cur = cur->next; } err = 0; exit: xmlFreeDoc (doc); BOOT_LOG (err, "Load race bonus item file %s", file); }
int load_candy(const char *file) { xmlDocPtr doc; xmlNodePtr cur, chl; int i, err = -1; int gifts_count; gifts_count = 0; memset (candyitem, 0, sizeof (candyitem)); doc = xmlParseFile (file); if (!doc) ERROR_RETURN (("load gifts config failed"), -1); cur = xmlDocGetRootElement(doc); if (!cur) { ERROR_LOG ("xmlDocGetRootElement error"); goto exit; } cur = cur->xmlChildrenNode; while (cur) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"Entry"))) { DECODE_XML_PROP_INT(i, cur, "ID"); if (gifts_count > GIFTS_TABLE_SIZE - 1 || gifts_count != i) { ERROR_LOG ("parse %s failed, Count=%d, id=%d", file, gifts_count, i); goto exit; } candyitem[i].send_gift_id = i; chl = cur->xmlChildrenNode; if ( (parse_candy_items(&candyitem[i], chl) != 0) ) goto exit; gifts_count++; } cur = cur->next; } err = 0; exit: xmlFreeDoc (doc); BOOT_LOG (err, "Load gifts item file %s", file); }
int daemon_start (int argc, char** argv) { struct sigaction sa; sigset_t sset; const char *style; rlimit_reset (); memset(&sa, 0, sizeof(sa)); sa.sa_handler = sigterm_handler; sigaction(SIGINT, &sa, NULL); sigaction(SIGTERM, &sa, NULL); sigaction(SIGQUIT, &sa, NULL); sa.sa_handler = sighup_handler; sigaction(SIGHUP, &sa, NULL); signal(SIGPIPE,SIG_IGN); signal(SIGCHLD,SIG_IGN); sigemptyset(&sset); sigaddset(&sset, SIGSEGV); sigaddset(&sset, SIGBUS); sigaddset(&sset, SIGABRT); sigaddset(&sset, SIGILL); sigaddset(&sset, SIGCHLD); sigaddset(&sset, SIGFPE); sigprocmask(SIG_UNBLOCK, &sset, &sset); arg_start = argv[0]; arg_end = argv[argc-1] + strlen (argv[argc - 1]) + 1; env_start = environ[0]; dup_argv(argc, argv); style = config_get_strval ("run_mode"); if (!style || !strcasecmp ("background", style)) { daemon (1, 1); backgd_mode = 1; BOOT_LOG (0, "switch to daemon mode"); } return 0; }
int load_xmlconf(const char* file, int (*parser)(xmlNodePtr cur_node)) { int err = -1; xmlDocPtr doc = xmlReadFile(file, NULL, XML_PARSE_NOBLANKS); if (!doc) { ERROR_LOG("Failed to Load %s", file); return -1; } xmlNodePtr cur = xmlDocGetRootElement(doc); if (!cur) { ERROR_LOG("xmlDocGetRootElement error"); goto fail; } err = parser(cur); fail: xmlFreeDoc(doc); BOOT_LOG(err, "==Load File %s", file); }
/** * @brief AsyncServer框架要求实现的接口之一。 * */ extern "C" int init_service(int isparent) { if (!isparent) { setup_timer(); init_all_timer_type(); init_funcs(); const char *udp_ip = get_server_ip(); uint16_t udp_port = get_server_port(); bind_udp_socket(udp_ip, udp_port); regist_timers(); if (load_xmlconf("../conf/GameSvr.xml", load_game_svr_config) == -1) return -1; max_msg_count = config_get_intval("max_msg_count", 1024); BOOT_LOG(0,"online udp listen:%s:%d %u",udp_ip, udp_port, max_msg_count); } return 0; }
/* @breif load friendbox.xml file */ int mw_load_friendbox_config(const char* file) { xmlDocPtr doc; xmlNodePtr cur; uint32_t itemid = 0; uint32_t i = 0; int err = -1; memset(&mw_friend_box_items, 0, sizeof (mw_friend_box_items)); doc = xmlParseFile (file); if (!doc) ERROR_RETURN (("load items config failed"), -1); cur = xmlDocGetRootElement(doc); if (!cur) { ERROR_LOG ("xmlDocGetRootElement error"); goto exit; } cur = cur->xmlChildrenNode; while (cur) { if (!xmlStrcmp(cur->name, (const xmlChar*)"Item")) { DECODE_XML_PROP_UINT32(itemid, cur, "ID"); mw_friend_box_items.itemids[i] = itemid; i++; } cur = cur->next; } mw_friend_box_items.count = i; err = 0; exit: xmlFreeDoc (doc); BOOT_LOG (err, "Load mw friend box item file %s", file); }
int main(int argc, char* argv[]) { pid_t pid; parse_args(argc, argv); if (config_init(argv[1]) == -1) { BOOT_LOG(-1, "Failed to Parse File '%s'", argv[1]); } if (config_init("common.conf") == -1) { BOOT_LOG(-1, "Failed to Parse File '%s'", argv[1]); } daemon_start(argc, argv); load_bind_file(); log_init_ex( config_get_strval("log_dir"), config_get_intval("log_level", log_lvl_trace), config_get_intval("log_size", 1<<30), config_get_intval("max_log_files", 0), config_get_strval("log_prefix") , config_get_intval("log_save_next_file_interval_min", 0) ); //Èç¹ûʹÓÃÔà´Ê¼ì²âÂß¼£¬Ôò¿ªÆô¸¸½ø³ÌµÄÔà´Ê¸üÐÂÂß¼. if (config_get_intval("tm_dirty_use_dirty_logical", 1) == 1) { if (tm_dirty_daemon( config_get_strval("tm_dirty_local_dirty_file_path"), config_get_strval("tm_dirty_server_addr"), config_get_intval("tm_dirty_update_cycle", 600), NULL) == -1) { BOOT_LOG(-1, "FAILED TO RUN TM_DIRTY_DAEMON"); } } net_init(MAXFDS, MAXFDS); bind_config_t* bc = get_bind_conf(); //-------------------------------- net_start(config_get_strval("online_ip"), config_get_intval("online_port", 443), bc->configs); //-------------------------------- // bind_config_elem_t* bc_elem; int i = 0; for ( ; i != bc->bind_num; ++i ) { bind_config_elem_t* bc_elem = &(bc->configs[i]); shmq_create(bc_elem); if ( (pid = fork ()) < 0 ) { BOOT_LOG(-1, "fork child process"); } else if (pid > 0) { //parent process close_shmq_pipe(bc, i, 0); do_add_conn(bc_elem->sendq.pipe_handles[0], PIPE_TYPE_FD, 0, bc_elem); //net_start(bc_elem->bind_ip, bc_elem->bind_port, bc_elem); } else { //child process run_worker_process(bc, i, i + 1); } } while (!stop) { net_loop(-1, PAGESIZE, 1); } net_exit(); shmq_destroy(0, bc->bind_num); daemon_stop(); return 0; }
int main(int argc, char* argv[]) { arg_start = argv[0]; arg_end = argv[argc-1] + strlen(argv[argc - 1]) + 1; env_start = environ[0]; if (argc != 2) exit(-1); daemon_start(); INFO_LOG ("async_server %s, report bugs to <*****@*****.**>", VERSION); load_config_file(argv[1]); check_single(); if (config_get_strval("proc_name", NULL)) { set_title("%s-MAIN", config_get_strval("proc_name", NULL)); } else { set_title("%s-MAIN", arg_start); } load_work_file(config_get_strval("work_conf", "")); if (-1 == log_init(config_get_strval("log_dir", "./"), (log_lvl_t)config_get_intval("log_level", 8), config_get_intval("log_size", 33554432), config_get_intval("log_maxfiles", 100), "main_")) { BOOT_LOG(-1, "log init"); } init_warning_system(); plugin_load(config_get_strval("plugin_file", "")); shmq_init(g_work_confs.size(), config_get_intval("shmq_size", 8388608)); int max_connect = config_get_intval("max_connect", 10000); if (max_connect <= 4096) max_connect = 4096; g_max_connect = max_connect; int max_pkg_len = config_get_intval("max_pkg_len", 16384); if (max_pkg_len <= 4096) max_pkg_len = 4096; g_max_pkg_len = max_pkg_len; const char * bind_ip = config_get_strval("bind_ip", NULL); if (NULL == bind_ip) { BOOT_LOG(-1, "unspecified bind_ip"); return -1; } if (0 != get_ip_by_name(bind_ip, g_bind_ip)) { strncpy(g_bind_ip, bind_ip, 16); } if (g_plugin.plugin_init) { if (g_plugin.plugin_init(PROC_MAIN) != 0) BOOT_LOG(-1, "plugin_init init failed PROC_MAIN"); } for (uint32_t i = 0; i < g_work_confs.size(); ++i) g_work_confs[i].pid = fork_work(i); pid_t conn_pid = fork_conn(); while (!g_stop) { int status = 0; pid_t p = waitpid(-1, &status, 0); if(-1 == p) continue; if (WEXITSTATUS(status) == 10) { if (p == conn_pid) { conn_pid = -1; } else { for (uint32_t i = 0; i < g_work_confs.size(); ++i) { if (g_work_confs[i].pid == p) { g_work_confs[i].pid = -1; break; } } } } else { if (p == conn_pid) { conn_pid = fork_conn(); send_warning_msg("conn core", 0, 0, 0, config_get_strval("bind_ip", "0.0.0.0")); ERROR_LOG("conn core"); } else { for (uint32_t i = 0; i < g_work_confs.size(); ++i) { if (g_work_confs[i].pid == p) { ERROR_LOG("work core, id: %u, pid: %d", g_work_confs[i].id, p); g_work_confs[i].pid = fork_work(i); send_warning_msg("work core", g_work_confs[i].id, 0, 0, config_get_strval("bind_ip", "0.0.0.0")); break; } } } } } for (uint32_t i = 0; i < g_work_confs.size(); ++i) { if (g_work_confs[i].pid != -1) kill(g_work_confs[i].pid, SIGTERM); } if (conn_pid != -1) kill(conn_pid, SIGTERM); while (true) { int ret = 0; for (uint32_t i = 0; i < g_work_confs.size(); ++i) { if (g_work_confs[i].pid != -1) ret = 1; } if (ret || conn_pid != -1) { int status = 0; pid_t p = waitpid(-1, &status, 0); if(-1 == p) continue; if (p == conn_pid) { conn_pid = -1; } else { for (uint32_t i = 0; i < g_work_confs.size(); ++i) { if (g_work_confs[i].pid == p) { g_work_confs[i].pid = -1; break; } } } } else { break; } } if (g_plugin.plugin_fini) g_plugin.plugin_fini(PROC_MAIN); }