69 lines
1.9 KiB
C
69 lines
1.9 KiB
C
#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);
|
|
} |