From f93971661470c97260f20436cd949cddfecf5717 Mon Sep 17 00:00:00 2001 From: rfeng Date: Fri, 28 Aug 2026 13:23:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=20ATSC=20=E5=BA=94=E7=94=A8=E9=87=8D=E5=A4=8D=E5=90=AF?= =?UTF-8?q?=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/daemon_cttb/src/daemon_system.c | 118 ++++++++++++++++++---------- 1 file changed, 78 insertions(+), 40 deletions(-) diff --git a/src/daemon_cttb/src/daemon_system.c b/src/daemon_cttb/src/daemon_system.c index bfc984a..7954787 100644 --- a/src/daemon_cttb/src/daemon_system.c +++ b/src/daemon_cttb/src/daemon_system.c @@ -5,68 +5,107 @@ ***************************************/ #include "common.h" +#include +#include -//程序名字 -#define PROGRAM_NAME "imx_atsc_app" #define NODE_NAME "http" -//查找进程中程序名字 -#define PROGRAM_NAME_FIND "imx_atsc_app" #define PROGRAM_NODE_NAME_FIND "http" //输出目录 -#define PROGRAM_DIR_OUT_FILE "/tmp/atsc_app_status" #define NODE_PROGRAM_DIR_OUT_FILE "/tmp/web_p_status" //要运行的程序 -//#define RUN_NAME_PROGRAM "/aw/anywave/app/imx_atsc_app 1 &" -#define RUN_NAME_PROGRAM "/aw/anywave/app/imx_atsc_app 1 2>&1 | loglog /var/module_log/ imx_atsc_app.log 1 &" +#define PROGRAM_EXE_PATH "/aw/anywave/app/imx_atsc_app" +#define RUN_NAME_PROGRAM PROGRAM_EXE_PATH " 2>&1 | /usr/sbin/loglog /var/module_log/ imx_atsc_app.log 1 &" #define RUN_NODE_NAME_PROGRAM "cd /aw/anywave/web/sh && ./start_web.sh &" +/* The application renames its main task with pthread_setname_np(), therefore + * BusyBox `ps | grep imx_atsc_app` can report it as missing and the daemon may + * start a second instance. /proc//exe remains stable across task renames + * and also lets us match the exact executable instead of a substring. */ +static int is_app_running(void) +{ + DIR *proc_dir; + struct dirent *entry; + char exe_link[64]; + char exe_path[PATH_MAX]; + ssize_t exe_len; + size_t expected_len = strlen(PROGRAM_EXE_PATH); -int main(int argc,char *argv[]) + proc_dir = opendir("/proc"); + if(proc_dir == NULL) + { + /* Fail safe: an unreadable /proc must not cause duplicate app starts. */ + return -1; + } + + while((entry = readdir(proc_dir)) != NULL) + { + const char *p = entry->d_name; + + if(*p == '\0') + { + continue; + } + while(*p >= '0' && *p <= '9') + { + p++; + } + if(*p != '\0') + { + continue; + } + + snprintf(exe_link, sizeof(exe_link), "/proc/%s/exe", entry->d_name); + exe_len = readlink(exe_link, exe_path, sizeof(exe_path) - 1); + if(exe_len < 0) + { + continue; + } + exe_path[exe_len] = '\0'; + + if(strcmp(exe_path, PROGRAM_EXE_PATH) == 0 || + (strncmp(exe_path, PROGRAM_EXE_PATH, expected_len) == 0 && + strcmp(exe_path + expected_len, " (deleted)") == 0)) + { + closedir(proc_dir); + return 1; + } + } + + closedir(proc_dir); + return 0; +} + + +int main(void) { int fd = 0; - int ret = 0; int remux_ok = 0; int node_ok = 0; char buf[100]; - char cmd[100] = {0}; + char cmd[256] = {0}; //开启守护进程 daemon(0,0); while (1) { - //新建输出文件 - memset(cmd, 0 ,sizeof(cmd)); - sprintf(cmd, "echo 0 > %s", PROGRAM_DIR_OUT_FILE); - ret = os_system(cmd); - - //获得程序ID - memset(cmd, 0 ,sizeof(cmd)); - sprintf(cmd, "ps | grep %s | grep -v grep >> %s", PROGRAM_NAME_FIND, PROGRAM_DIR_OUT_FILE); - ret = os_system(cmd); - - //打开输出文件 - fd = open(PROGRAM_DIR_OUT_FILE, O_CREAT|O_RDONLY, 0777); - memset(buf, 0, 100); - read(fd, buf, 100); - close(fd); - remux_ok = match(buf, PROGRAM_NAME, 90); + remux_ok = is_app_running(); // web memset(cmd, 0 ,sizeof(cmd)); sprintf(cmd, "echo 0 > %s", NODE_PROGRAM_DIR_OUT_FILE); - ret = os_system(cmd); + (void)os_system(cmd); //获得程序ID memset(cmd, 0 ,sizeof(cmd)); sprintf(cmd, "ps | grep %s | grep -v grep >> %s", PROGRAM_NODE_NAME_FIND, NODE_PROGRAM_DIR_OUT_FILE); - ret = os_system(cmd); + (void)os_system(cmd); //打开输出文件 fd = open(NODE_PROGRAM_DIR_OUT_FILE, O_CREAT|O_RDONLY, 0777); @@ -80,14 +119,17 @@ int main(int argc,char *argv[]) //判断是否有程序文件运行 if(1 != remux_ok) { - //运行程序 + /* Debounce once before starting. This prevents a duplicate launch + * when the app is between exec/startup states during an upgrade. */ usleep(1000000); - - memset(cmd, 0 ,sizeof(cmd)); - sprintf(cmd, "%s", RUN_NAME_PROGRAM); - printf("imx_atsc_app stop , daemon work.\n%s\n\n", cmd); - system(cmd); - usleep(100000); + if(!is_app_running()) + { + memset(cmd, 0 ,sizeof(cmd)); + snprintf(cmd, sizeof(cmd), "%s", RUN_NAME_PROGRAM); + printf("imx_atsc_app stop, daemon restart without legacy argument.\n%s\n\n", cmd); + system(cmd); + usleep(100000); + } } if(1 != node_ok) { @@ -102,13 +144,9 @@ int main(int argc,char *argv[]) //删除输出文件 - memset(cmd, 0 ,sizeof(cmd)); - sprintf(cmd, "rm %s", PROGRAM_DIR_OUT_FILE); - ret = os_system(cmd); - memset(cmd, 0 ,sizeof(cmd)); sprintf(cmd, "rm %s", NODE_PROGRAM_DIR_OUT_FILE); - ret = os_system(cmd); + (void)os_system(cmd); }