小总结一下c/c++检测指定进程是否存在的方式;
方式不唯一,列举本人亲测的方式,没有过多思考,简单实现。
linux:
//linux判断进程是否存在
FILE* fp;
char szbuffer[16] = {0};
fp = popen("ps -ef|grep processName | grep -v grep |wc -l", "r");
//1:存在 0:不存在
fread(szbuffer, 1, 1, fp); //第一个字节就是fp读取出来的结果 0或1,一个字节就可以,sizeof(szbuffer)会有空格补齐,strcmp对比时有误
if(strcmp(szbuffer, "1") != 0)
{
printf("processName is not exist.\n");
}
else
{
printf("processName is exist.\n");
}
pclose(fp);
通过命令行命令获取指定进程的状态,利用popen执行命令并将结果存储到文件指针中,读取指针结果。
windows:
DWORD GetProcessidFromName(LPCTSTR processName)
{
PROCESSENTRY32 pe;
DWORD id = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == INVALID_HANDLE_VALUE)
return 0;
pe.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hSnapshot, &pe))
{
CloseHandle(hSnapshot);
return 0;
}
do
{
// 使用 _tcscmp 替代 strcmp,自动适应 ANSI/Unicode 字符集
if (_tcscmp(pe.szExeFile, processName) == 0)
{
id = pe.th32ProcessID;
break;
}
} while (Process32Next(hSnapshot, &pe));
CloseHandle(hSnapshot);
return id;
}
qt:
QProcess process;
QString cmd = "tasklist";
process.start(cmd); //打开任务列表
process.waitForFinished(); //等待进程结束
QString str = process.readAllStandardOutput();//获取执行命令后的输出内容
if(str.contains(processName))//判断是否有包含当前指定的进程名
{
qDebug()<<"processName exist.";
}
else
{
qDebug()<<"processName not exist.";
}
只做了简单实现,记录一下,以防后续有需要。