由于项目中遇到UDP去bind某个端口,所以如果程序已经打开过了,或者程序崩溃了,然后存在于后台程序中,那么我新打开的程序的UDP去bind那个端口,就会bind失败。所以为了避免在启动程序的时候后台已经有一个的情况,我采用的是获取进程,筛选,然后根据PID,调用系统命令去kill掉它。
原理就是:
通过tasklist.exe获取任务列表,放到QString里,然后进行 split分割,具体可以打印QString看看,我这里使用的是split("\r\n");然后对得到的QStringList进行过滤,filter(QRegExp(QCoreApplication::applicationName()))
我这里是想找到同本进程名的旧进程。然后继续字符串处理(具体看代码吧),获取PID,然后使用系统命令 TASKKILL /PID 2920 /F 进行程序的清理(2920是PID)。
好了,看代码吧:
void KilloldProcess()
{
QString killPID;
QProcess killprocess;
killprocess.start("tasklist.exe");
QStringList resultlist;
if(killprocess.waitForFinished())
{
QString result = killprocess.readAll();
resultlist = result.split("\r\n");
}
QStringList applicationinfolist;
applicationinfolist= resultlist.filter(QRegExp(QCoreApplication::applicationName()));
foreach (QString applicationinfo, applicationinfolist) {
applicationinfo.replace(QRegExp("[\\s]+"), " ");
QStringList infolist = applicationinfo.split(" ");
qDebug() << "infolist " << infolist;
if(infolist.size() >= 2)
{
killPID = infolist.at(1);
}
if(killPID.toInt() != 0 && killPID != QString::number(QCoreApplication::applicationPid()))
{
QString cmd = QString("TASKKILL /PID %1 /F").arg(killPID);
killprocess.start(cmd.toStdString().c_str());
killprocess.waitForFinished();
}
}
}
有问题欢迎留言交流~