#include "OsSample.h" #include "work.h" #include "canDriver.h" #include "network.h" #define APP_NAME "UniversalCan" int SearchPreProcess(const char* processName); void KillPreProcess(const char* processName); int main(void) { //此程序必须只有一个进程在运行 while (SearchPreProcess(APP_NAME) == ENABLE) { //杀死上一个进程 KillPreProcess(APP_NAME); printf("Kill Pre Process\n"); //等待进程里面的socket和内存被释放 vTaskDelay(500); } // 初始化队列和任务等等 // 初始化网络 NetProcessInit(LISTEN_PORT); // 初始化CAN CanProcessInit(); // 初始化network vTaskStartScheduler(); } // 查找是否有指定名称的进程在运行(排除自身) int SearchPreProcess(const char* processName) { char cmd[512]; #ifdef _WIN32 DWORD currentPID = GetCurrentProcessId(); // Windows 下通常需要 .exe 后缀,建议传入时带上或在这里处理 snprintf(cmd, sizeof(cmd), "tasklist | findstr \"%s\" | findstr /v \"%lu\" > nul", processName, currentPID); #elif defined(__linux__) snprintf(cmd, sizeof(cmd), "pgrep -x \"%s\" | grep -v %d > /dev/null 2>&1", processName, getpid()); #endif return system(cmd) == 0 ? ENABLE : DISABLE; } // 杀死指定名称的同名进程(排除自身) void KillPreProcess(const char* processName) { char cmd[512]; // 稍微加大 buffer 以防万一 #ifdef _WIN32 DWORD currentPID = GetCurrentProcessId(); // 逻辑不变,仅参数化进程名 snprintf(cmd, sizeof(cmd), "for /f \"tokens=2\" %%a in ('tasklist ^| findstr \"%s\"') do if not %%a==%lu taskkill /F /PID %%a", processName, currentPID); #elif defined(__linux__) snprintf(cmd, sizeof(cmd), "pgrep -x \"%s\" | grep -v %d | xargs -r kill -9 > /dev/null 2>&1", processName, getpid()); #endif system(cmd); }