#include #include #include #include "log_common.h" #include "ulog_api.h" #define SEV_TIMEOUT 1 #define SEV_CMD "systemctl restart rsyslog" static sem_t g_sem; static int is_exit = 0; static void sev_restart() { ULOG_DEBUG(g_log, "Log service is restarting"); FILE *pp = popen(SEV_CMD, "r"); if (pp == NULL) { ULOG_ERR(g_log, "Open cmd:%s is failure:%s", SEV_CMD, strerror(errno)); goto END; } char buff[256]; while(fread(buff, 1, sizeof(buff), pp) > 0) { ULOG_ERR(g_log, "Executing cmd:%s is failure, response content is %s", SEV_CMD, buff); goto END; } ULOG_INFO(g_log, "Restarting log service is success"); END: if (pp != NULL) { pclose(pp); } //event_del(signal); } void sev_loop() { while (1) { if (sem_wait(&g_sem) != 0) { ULOG_ERR(g_log, "Waitting semaphore is failure:%s", strerror(errno)); break; } if (is_exit == 1) { ULOG_DEBUG(g_log, "Service loop is exit"); break; } sleep(SEV_TIMEOUT); sev_restart(); } } int log_sev_init() { ULOG_INFO(g_log, "Log service is initiating"); if (sem_init(&g_sem, 0, 0) != 0) { ULOG_ERR(g_log, "Init sem is failure:%s", strerror(errno)); return -1; } return 0; } static int set_sem() { if (sem_post(&g_sem) == -1) { ULOG_ERR(g_log, "Posting semaphore is failure:%s", strerror(errno)); return -1; } return 0; } int log_sev_exit() { is_exit = 1; set_sem(); sem_destroy(&g_sem); return 0; } int log_sev_restart() { int val; if (sem_getvalue(&g_sem, &val) != 0) { ULOG_ERR(g_log, "Get semaphore value is failure:%s", strerror(errno)); return -1; } if (val > 0) { ULOG_ERR(g_log, "Current semaphore value is %d, not need to set semaphore"); return 0; } if (set_sem() != 0) { return -1; } return 0; }