北京酷站科技有限公司,51网站空间相册,企业推广费用占比多少合适,柳州网站建站费用Qt 进程守护程序
简单粗暴的监控#xff0c;方法可整合到其他代码。
一、windows环境下 1、进程查询函数 processCount函数用于查询系统所有运行的进程中该进程运行的数量#xff0c;比如启动了5个A进程#xff0c;该函数查询返回的结果就为5。 windows下使用了API接口查询…Qt 进程守护程序
简单粗暴的监控方法可整合到其他代码。
一、windows环境下 1、进程查询函数 processCount函数用于查询系统所有运行的进程中该进程运行的数量比如启动了5个A进程该函数查询返回的结果就为5。 windows下使用了API接口查询进程信息该函数纯C无Qt库相关代码注释对代码进行了详细解释。
int processCount(const char* processName)
{int countProcess 0;//CreateToolhelp32Snapshot 获取系统中正在运行的进程信息线程信息等HANDLE toolHelp32Snapshot CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (((int)toolHelp32Snapshot) ! -1){PROCESSENTRY32 processEntry32;processEntry32.dwSize sizeof(processEntry32);if(Process32First(toolHelp32Snapshot, processEntry32)) //判断进程获取首进程是否存在{do{int iLen 2 * wcslen(processEntry32.szExeFile); //wcslen - 计算宽字符串的长度char* currentProcessName new char[iLen 1];wcstombs(currentProcessName, processEntry32.szExeFile, iLen 1); //将宽字符转换成多字符if (strcmp(processName, currentProcessName) 0) //对比进程名countProcess;delete []currentProcessName;}while (Process32Next(toolHelp32Snapshot, processEntry32)); //进程获取函数,获取下一个进程名}//关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。CloseHandle(toolHelp32Snapshot);}return countProcess;
}2、进程守护代码 进程守护其实就是使用一个进程去定时查询另外一个被守护的进程是否存在不存在则需要启动该进程。代码如下运行时首先需要获取被守护的进程APP使用读取配置文件的方式如果配置文件不存在首次启动该代码则需要选择被守护的进程然后将选择的APP路劲存入配置文件供下次启动读取使用。
#include QApplication
#include QFileDialog
#include QSettings
#include windows.h
#include QDebug
#include QDateTimeint main(int argc, char *argv[])
{QSettings sets(sys.ini, QSettings::IniFormat);QString targetExePath sets.value(KEY_EXE_PATH).toString();if ( targetExePath){//首次需要选择 被守护的进程QString exepath QFileDialog::getOpenFileName(nullptr, 选择程序, D:/, Exe files (*.exe));if ( ! exepath)sets.setValue(KEY_EXE_PATH, exepath); //写入配置文件}while (1) //死循环不断查询判断{//targetExePath sets.value(KEY_EXE_PATH).toString();QString exeName targetExePath.split(/).last();QDateTime strtTime QDateTime::currentDateTime();int countProcess processCount(exeName.toStdString().c_str()); // 查询该进程运行数量qDebug()use times for Query process:strtTime.msecsTo(QDateTime::currentDateTime())(ms) countProcess:countProcess;if (countProcess 0)system(targetExePath.toStdString().c_str()); //关闭状态 重启进程,注意这里实际运行会阻塞在这里一直等到被守护的线程结束。Sleep(3000);}
}二、linux环境下 1、进程查询函数
原理 使用 popen函数 pidof命令 查询对应进程的pid该方法的缺点就是不能像windows那样读取所有进程名从而获取该进程运行的数量。所以如果一个程序加载多个进程同程序进程名相同pid不同使用该方法只能获取最后一个启动的进程pid。
popen属于标准I/O函数库中函数使用该函数启动另外一个进程去执行一个shell命令行。 这里我们称调用popen的进程为父进程由popen启动的进程称为子进程。 popen函数还创建一个管道用于父子进程间通信。父进程要么从管道读信息要么向管道写信息至于是读还是写取决于父进程调用popen时传递的参数。
实现函数如下函数参数输入进程名返回进程的pid,如果返回0则表示进程不存在或未运行。
void Widget::watchdog()
{//守护进程QTimer* updateTimer new QTimer(this);connect(updateTimer, SIGNAL(timeout()), this, SLOT(checkApp()));updateTimer-start(300);
}void Widget::checkApp()
{if (getProcessPidByName(AppName) 0) {system(cd /sdcard);system(./AppName );qDebug() ;qDebug() _ __ _____ _ ;qDebug() | |/ / / ____|| | ;qDebug() | / __ _ _ __ __ _ | | | |__ _ _ __ _ _ __ __ _ ;qDebug() | / _ || _ \\ / _ | | | | _ \\ | | | | / _ || _ \\ / _ |;qDebug() | . \\ | (_| || | | || (_| | | |____ | | | || |_| || (_| || | | || (_| |;qDebug() |_|\\_\\ \\__,_||_| |_| \\__, | \\_____||_| |_| \\__,_| \\__,_||_| |_| \\__, |;qDebug() __/ | __/ |;qDebug() |____/ |____/ ;qDebug() ;}
}int Widget::getProcessPidByName(const char* proc_name)
{FILE* fp;char buf[100];char cmd[200] { \0 };int pid -1;sprintf(cmd, pidof %s, proc_name);if ((fp popen(cmd, r)) ! NULL) {if (fgets(buf, 255, fp) ! NULL)pid atoi(buf);}pclose(fp);return pid;
}