linux下Qt获取进程的信息:进程名、命令行
在 Linux 下使用 Qt 获取进程信息(如进程名、命令行参数),可以通过解析 /proc
文件系统或调用系统命令(如 ps
)来实现。以下是几种常见的方法:
方法 1:解析 /proc
文件系统(推荐)
Linux 的 /proc
目录包含所有运行进程的信息,每个进程对应一个以 PID 命名的子目录(如 /proc/1234
)。我们可以读取这些文件来获取进程信息。
获取所有进程的 PID
#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
文件中:
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
分隔:
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;
}
完整示例:获取所有进程信息
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
命令获取进程信息:
#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
:
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;
}
示例使用:
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 下的进程信息! 🚀