在Ubuntu系统下使用Qt C++检测指定进程是否启动,可以通过以下步骤实现:
方案思路
- 使用
ps -C命令:通过进程名直接查询,避免grep误匹配问题。 - QProcess执行系统命令:利用Qt的跨平台进程管理工具执行命令并捕获输出。
- 解析输出结果:检查命令输出是否包含目标进程信息。
代码实现
cpp
#include <QCoreApplication> #include <QProcess> #include <QDebug> bool isProcessRunning(const QString &processName) { QProcess process; // 执行ps -C命令查询进程 process.start("ps", QStringList() << "-C" << processName); process.waitForFinished(); if (process.exitStatus() == QProcess::NormalExit) { QByteArray output = process.readAllStandardOutput(); // 检查输出是否包含进程名(排除标题行) return !output.contains(processName.toUtf8(), Qt::CaseSensitive); } return false; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString targetProcess = "SanliLisenter"; if (isProcessRunning(targetProcess)) { qDebug() << targetProcess << "is running"; } else { qDebug() << targetProcess << "is NOT running"; } return a.exec(); }关键点说明
ps -C参数:- 直接通过进程名过滤,避免
grep命令自身被匹配的问题。 - 示例:
ps -C SanliLisenter会列出所有名为SanliLisenter的进程。
- 直接通过进程名过滤,避免
- 输出解析逻辑:
- 命令成功执行后,检查输出是否包含目标进程名。
- 输出示例(进程存在时):
PID TTY TIME CMD 1234 ? 00:00:01 SanliLisenter
- 错误处理:
- 检查
QProcess的退出状态,确保命令执行成功。 - 失败时返回
false,可扩展错误日志记录。
- 检查
扩展建议
- 多进程检测:修改函数参数为
QStringList,支持批量检测。 - PID获取:通过
ps输出解析具体PID,用于后续操作(如发送信号)。 - 权限管理:若检测系统级进程,需确保程序具有相应权限(如
sudo)。
测试验证
- 编译运行程序:
bashqmake -project qmake make ./your_executable - 启动目标进程后再次运行,观察输出变化。
此方案直接利用系统命令,兼容性好且实现简洁,适合在Qt应用中集成进程监控功能。