问题描述
我正在使用Qt,QProcess启动一个进程,但是目前无法使用QProcess检查现有的正在运行的进程。
我需要一种在多个平台上实现此目标的方法。我有一个要查找的应用程序名称,如果正在运行,我想获取它的PID。如果它没有运行,我将为其创建一个实例,这是我可以做的最后一遍。
我在Mac上工作,到目前为止,我已完成以下操作:
pid_t pid = fork();
if ( pid > 0 ) {
int intStatus;
while ( (pid = waitpid(-1,&intStatus,WNOHANG)) == 0) {
system("ps -A");
qDebug() << "Still waiting!";
sleep(20);
}
qDebug() << "Exit Status %d" << WEXITSTATUS(intStatus);
}
上面执行命令并将输出转储到控制台中,我需要捕获它以便可以对其进行处理。
也在寻找一种在Windows平台上实现此目标的方法。
解决方法
我不确定如何在Linux或UNIX上进行此操作,但这是Windows的示例。
int CheckProc(const wchar_t* procName,PROCESSENTRY32 *procEntry)
{
HANDLE hSnap;
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (hSnap == INVALID_HANDLE_VALUE)
{
printf("invalid handle value %s",(char*)hSnap);
return -1;
}
procEntry->dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hSnap,procEntry))
{
printf("process32first failed");
CloseHandle(hSnap);
return -1;
}
do
{
if(wcscmp(procEntry->szExeFile,procName) == 0)
{
return 1;
}
} while (Process32Next(hSnap,procEntry));
CloseHandle(hSnap);
return 0;
}
int main()
{
PROCESSENTRY32 procEntry;
const wchar_t* procName = L"process name";
CheckProc(procName,&procEntry);
std::cout << "PID: " << procEntry.th32ProcessID;
}
,
在Posix系统上,可以使用ps
捕获popen
的输出,然后进行解析。 popen
部分看起来像这样:
#include <iostream>
#include <cstdio>
int main()
{
FILE *f = popen ("ps -A","r");
char s [1024];
while (fgets (s,sizeof (s),f))
std::cout << s;
pclose (f);
}