检查多个平台上的流程?

问题描述

我正在使用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);
}

Live demo