/** *@brief 主函数 启动子进程运行主体程序 并用父进程监控子进程的运行状况 */ int main(int argc, char** argv) { if( logs_init("wizard_logs") ){ printf("DATA_ERROR:%s %d -- logs_init error!!!!\n",__FILE__, __LINE__); exit(-1); } // 守护进程(父进程) int status; for(;;){ if(0 == fork() ){ run(); } xyprintf(0, "ELF_THREAD:The child process is running!"); waitpid(-1, &status, 0); xyprintf(0, "ELF_THREAD:The child process is dead!"); if(WIFSIGNALED(status)) { xyprintf(0, "ELF_THREAD:The child process is dead! Signal is %d", WTERMSIG(status) ); } } }
void init() { /* Load persistent settings, or set the default values. */ if(persistent_load() == -1) { wanted_temperature = TEMP_DEF; wanted_humidity = HUM_DEF; } i2c_init(); httpd_init(); logs_init(); pid_init(); struct sigaction sa = (struct sigaction) { .sa_handler = &reload, .sa_flags = 0, .sa_restorer = NULL }; sigemptyset(&(sa.sa_mask)); sigaddset(&(sa.sa_mask), SIGUSR1); sigaddset(&(sa.sa_mask), SIGINT); sigaddset(&(sa.sa_mask), SIGTERM); if(sigaction(SIGUSR1, &sa, NULL) < 0) { fprintf(stderr, "Couldn't install signal handler.\n"); exit(1); } sa.sa_handler = &end; if(sigaction(SIGTERM, &sa, NULL) < 0 || sigaction(SIGINT, &sa, NULL) < 0) { fprintf(stderr, "Couldn't install signal handler.\n"); exit(1); } } void reload(int signal) { httpd_reload(); } int main(int argc, char **argv) { float data[2]; init(); struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); for(;;) { if(!read_data(data)) { continue; } log_values(data[1], data[0]); pid_control(data[1], data[0]); stats(); if(logstdout(data) == EOF) { break; } delay_ns(&ts, PERIOD_S, 0); } end(); }
/** *@brief 主体程序 由子进程运行 */ void run() { //关闭 父进程打开的log文件 logs_destroy(); //打开 子进程的log文件 if( logs_init("logs") ){ printf("DATA_ERROR:%s %d -- logs_init error!!!!\n",__FILE__, __LINE__); exit(-1); } //打印程序启动标志信息 xyprintf(0, "\n\t\t\t*************************************************************************\n\ *************************************************************************\n\ **** ****\n\ **** The Authenticate is running! ****\n\ **** Pid is %d ****\n\ **** %s ****\n\ **** ****\n\ *************************************************************************\n\ *************************************************************************\n", getpid(), PROFRAM_VERSION); //获取配置 if( get_config() ){ xyprintf(0, "DATA_ERROR:%s %d -- Get config of datebase is failed!", __FILE__, __LINE__); sleep(1000); exit(-1); } pthread_mutex_init(&gv_list_lock, 0); pthread_mutex_init(&gv_simple_gg2_list_lock, 0); pthread_mutex_init(&gv_up_addr_lock, 0); pthread_mutex_init(&gv_guide_flag_lock, 0); //信号屏蔽 signal(SIGPIPE, SIG_IGN); /*************************thread pool run*********************************************/ pool_init(48, 192, 16, cgv_sql_name, cgv_sql_user, cgv_sql_pass); sleep(1); /*************************与guide交互线程**********************************************/ pthread_t guide_mutual_pt; if( pthread_create(&guide_mutual_pt, NULL, guide_mutual_thread, NULL) != 0 ){ xyprintf(errno, "PTHREAD_ERROR: %s %d -- pthread_create()", __FILE__, __LINE__); } /**************************************************************************************/ while(1){ pthread_mutex_lock(&gv_guide_flag_lock); if(gv_guide_flag){ auth_sql_repair(gv_auth_code); pthread_mutex_unlock(&gv_guide_flag_lock); break; } pthread_mutex_unlock(&gv_guide_flag_lock); sleep(1); } /*************************路由器连接监听线程******************************************/ pthread_t router_conn_pt; if( pthread_create(&router_conn_pt, NULL, router_conn_thread, NULL) != 0 ){ xyprintf(errno, "PTHREAD_ERROR: %s %d -- pthread_create()", __FILE__, __LINE__); } /*************************路由器epoll线程*********************************************/ pthread_t router_epoll_pt; if( pthread_create(&router_epoll_pt, NULL, router_epoll_thread, NULL) != 0 ){ xyprintf(errno, "PTHREAD_ERROR: %s %d -- pthread_create()", __FILE__, __LINE__); } /*************************mac上线 允许上网处理线程************************************/ pthread_t platform_conn_thread_pt; if( pthread_create(&platform_conn_thread_pt, NULL, platform_conn_thread, NULL) != 0 ){ xyprintf(errno, "PTHREAD_ERROR: %s %d -- pthread_create()", __FILE__, __LINE__); } //pthread_t scanSQL_online_pt; //if( pthread_create(&scanSQL_online_pt, NULL, scanSQL_online_thread, NULL) != 0 ){ // xyprintf(errno, "PTHREAD_ERROR: %s %d -- pthread_create()", __FILE__, __LINE__); //} /*************************mac踢出 处理线程********************************************/ pthread_t scanSQL_takeout_pt; if( pthread_create(&scanSQL_takeout_pt, NULL, scanSQL_takeout_thread, NULL) != 0 ){ xyprintf(errno, "PTHREAD_ERROR: %s %d -- pthread_create()", __FILE__, __LINE__); } /*************************定时重启设备线程*********************************************/ pthread_t timing_restart_pt; if( pthread_create(&timing_restart_pt, NULL, timing_restart_thread, NULL) != 0 ){ xyprintf(errno, "PTHREAD_ERROR: %s %d -- pthread_create()", __FILE__, __LINE__); } /**************************************************************************************/ while(1){ sleep(1000); } //执行不到的地方 pthread_mutex_destroy(&gv_up_addr_lock); pthread_mutex_destroy(&gv_list_lock); pthread_mutex_destroy(&gv_simple_gg2_list_lock); pthread_mutex_destroy(&gv_guide_flag_lock); }