void process() { unsigned short port(g_confvalue.http_listen.port); string ip(g_confvalue.http_listen.ip); short timeout(5); CHttpServer httpserver(port, ip.c_str(), timeout); if (!httpserver.work()) { logerr("httpserver start fail"); } for (; ;) { select_sleep(1000, 0); } }
int main(int argc, char *argv[]) { int i; pid_t pid; char *package_name = NULL; char *service_name = NULL; char *daemon_file_dir = NULL; int interval = SLEEP_INTERVAL; LOGI(LOG_TAG, "Copyright (c) 2015, Vincent Cheung<*****@*****.**>"); if (argc < 7) { LOGE(LOG_TAG, "usage: %s -p package-name -s " "daemon-service-name -t interval-time", argv[0]); return; } for (i = 0; i < argc; i ++) { if (!strcmp("-p", argv[i])) { package_name = argv[i + 1]; LOGD(LOG_TAG, "package name: %s", package_name); } if (!strcmp("-s", argv[i])) { service_name = argv[i + 1]; LOGD(LOG_TAG, "service name: %s", service_name); } if (!strcmp("-t", argv[i])) { interval = atoi(argv[i + 1]); LOGD(LOG_TAG, "interval: %d", interval); } } /* package name and service name should not be null */ if (package_name == NULL || service_name == NULL) { LOGE(LOG_TAG, "package name or service name is null"); return; } if ((pid = fork()) < 0) { exit(EXIT_SUCCESS); } else if (pid == 0) { /* add signal */ signal(SIGTERM, sigterm_handler); /* become session leader */ setsid(); /* change work directory */ chdir("/"); for (i = 0; i < MAXFILE; i ++) { close(i); } /* find pid by name and kill them */ int pid_list[100]; int total_num = find_pid_by_name(argv[0], pid_list); LOGD(LOG_TAG, "total num %d", total_num); for (i = 0; i < total_num; i ++) { int retval = 0; int daemon_pid = pid_list[i]; if (daemon_pid > 1 && daemon_pid != getpid()) { retval = kill(daemon_pid, SIGTERM); if (!retval) { LOGD(LOG_TAG, "kill daemon process success: %d", daemon_pid); } else { LOGD(LOG_TAG, "kill daemon process %d fail: %s", daemon_pid, strerror(errno)); exit(EXIT_SUCCESS); } } } LOGD(LOG_TAG, "child process fork ok, daemon start: %d", getpid()); while(sig_running) { interval = interval < SLEEP_INTERVAL ? SLEEP_INTERVAL : interval; select_sleep(interval, 0); LOGD(LOG_TAG, "check the service once, interval: %d", interval); /* start service */ start_service(package_name, service_name); } exit(EXIT_SUCCESS); } else { /* parent process */ exit(EXIT_SUCCESS); } }