linux下Qt获取进程的信息:进程名、命令行

在 Linux 下使用 Qt 获取进程信息(如进程名、命令行参数),可以通过解析 /proc 文件系统或调用系统命令(如 ps)来实现。以下是几种常见的方法:


方法 1:解析 /proc 文件系统(推荐)

Linux 的 /proc 目录包含所有运行进程的信息,每个进程对应一个以 PID 命名的子目录(如 /proc/1234)。我们可以读取这些文件来获取进程信息。

获取所有进程的 PID

cpp
 
复制
 
下载
#include <QDir>
#include <QDebug>

QList<int> getAllPids() {
    QList<int> pids;
    QDir procDir("/proc");

    // 遍历 /proc 下的所有目录(数字目录代表进程)
    for (const QString &dirName : procDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
        bool ok;
        int pid = dirName.toInt(&ok);
        if (ok) {
            pids.append(pid);
        }
    }

    return pids;
}

获取进程名(comm

进程名存储在 /proc/[PID]/comm 文件中:

cpp
 
复制
 
下载
QString getProcessName(int pid) {
    QFile commFile(QString("/proc/%1/comm").arg(pid));
    if (commFile.open(QIODevice::ReadOnly)) {
        return QString(commFile.readAll()).trimmed();
    }
    return QString();
}

获取命令行参数(cmdline

命令行参数存储在 /proc/[PID]/cmdline 文件中,参数以 \0 分隔:

cpp
 
复制
 
下载
QStringList getProcessCommandLine(int pid) {
    QFile cmdlineFile(QString("/proc/%1/cmdline").arg(pid));
    if (!cmdlineFile.open(QIODevice::ReadOnly)) {
        return QStringList();
    }

    QByteArray cmdlineData = cmdlineFile.readAll();
    QStringList args;

    // cmdline 文件中的参数以 '\0' 分隔
    int start = 0;
    for (int i = 0; i < cmdlineData.size(); ++i) {
        if (cmdlineData.at(i) == '\0') {
            args.append(QString::fromLocal8Bit(cmdlineData.mid(start, i - start)));
            start = i + 1;
        }
    }

    // 添加最后一个参数(如果没有 '\0' 结尾)
    if (start < cmdlineData.size()) {
        args.append(QString::fromLocal8Bit(cmdlineData.mid(start)));
    }

    return args;
}

完整示例:获取所有进程信息

cpp
 
复制
 
下载
void printAllProcesses() {
    QList<int> pids = getAllPids();

    for (int pid : pids) {
        QString name = getProcessName(pid);
        QStringList cmdline = getProcessCommandLine(pid);

        qDebug() << "PID:" << pid;
        qDebug() << "Name:" << name;
        qDebug() << "Command Line:" << cmdline.join(" ");
        qDebug() << "----------------------";
    }
}

方法 2:调用 ps 命令(简单但依赖外部工具)

如果不想直接解析 /proc,可以调用 ps 命令获取进程信息:

cpp
 
复制
 
下载
#include <QProcess>
#include <QDebug>

void getProcessInfoUsingPs() {
    QProcess process;
    process.start("ps", QStringList() << "-eo" << "pid,comm,cmd");
    process.waitForFinished();

    QString output = process.readAllStandardOutput();
    QStringList lines = output.split("\n", Qt::SkipEmptyParts);

    for (const QString &line : lines) {
        // 示例输出: "1234 bash /usr/bin/bash --login"
        QStringList parts = line.trimmed().split(" ", Qt::SkipEmptyParts);
        if (parts.size() >= 3) {
            int pid = parts[0].toInt();
            QString name = parts[1];
            QString cmdline = parts.mid(2).join(" ");

            qDebug() << "PID:" << pid;
            qDebug() << "Name:" << name;
            qDebug() << "Command:" << cmdline;
            qDebug() << "----------------------";
        }
    }
}

说明

  • ps -eo pid,comm,cmd 输出所有进程的 PID、进程名和完整命令行。

  • 优点:代码简单,兼容性好。

  • 缺点:依赖 ps 命令,性能略低于直接读取 /proc


方法 3:使用 QProcess 和 pgrep/pkill(查找特定进程)

如果需要查找特定进程(如 firefox),可以结合 pgrep 和 /proc

cpp
 
复制
 
下载
QList<int> findProcessIdsByName(const QString &processName) {
    QProcess pgrepProcess;
    pgrepProcess.start("pgrep", QStringList() << processName);
    pgrepProcess.waitForFinished();

    QString output = pgrepProcess.readAllStandardOutput();
    QList<int> pids;

    for (const QString &line : output.split("\n", Qt::SkipEmptyParts)) {
        bool ok;
        int pid = line.toInt(&ok);
        if (ok) {
            pids.append(pid);
        }
    }

    return pids;
}

示例使用

cpp
 
复制
 
下载
QList<int> firefoxPids = findProcessIdsByName("firefox");
for (int pid : firefoxPids) {
    qDebug() << "Firefox PID:" << pid;
    qDebug() << "Command Line:" << getProcessCommandLine(pid);
}

总结

方法优点缺点
解析 /proc 不依赖外部命令,性能高 需要手动解析文件
调用 ps 代码简单,兼容性好 依赖 ps 命令
pgrep + /proc 适合查找特定进程 需要额外命令

推荐

  • 如果需要高性能和纯 Qt 方案,使用 方法 1(解析 /proc

  • 如果代码简洁更重要,使用 方法 2(调用 ps

  • 如果只关心特定进程,使用 方法 3(pgrep + /proc

希望这些方法能帮助你获取 Linux 下的进程信息! 🚀

posted @ 2025-04-25 18:24  远方是什么样子  阅读(170)  评论(0)    收藏  举报