检查多个平台上的进程?
Check for process on multiple platforms?
我正在使用 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 系统上,您可以使用 popen
捕获 ps
的输出,然后对其进行解析。 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);
}
我正在使用 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 系统上,您可以使用 popen
捕获 ps
的输出,然后对其进行解析。 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);
}