检查多个平台上的进程?

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);
}

Live demo