news 2026/6/9 18:43:19

ubuntu qt c++ 根据进程名,查看运行的进程有几个

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ubuntu qt c++ 根据进程名,查看运行的进程有几个

1.ubuntu qt c++ 根据进程名,查看运行的进程有几个

记忆要点

// 执行pgrep命令获取进程数量

process.start("pgrep", QStringList() << "-c" << processName);

bool ok;

int count = output.toInt(&ok);

在Ubuntu系统下使用Qt C++根据进程名统计运行进程数量,可通过两种方法实现。以下是具体方案及代码示例:

方法一:使用系统命令pgrep(推荐)

通过QProcess执行系统命令pgrep -c直接获取进程数量,代码简洁且效率高。

cpp

#include <QCoreApplication> #include <QProcess> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString processName = "your_process_name"; // 替换为实际进程名 QProcess process; // 执行pgrep命令获取进程数量 process.start("pgrep", QStringList() << "-c" << processName); process.waitForFinished(); if (process.exitStatus() == QProcess::NormalExit) { QByteArray output = process.readAllStandardOutput().trimmed(); bool ok; int count = output.toInt(&ok); if (ok) { qDebug() << "Number of processes:" << count; } else { qDebug() << "Error: Invalid output from pgrep"; } } else { qDebug() << "Error: Command failed with exit code" << process.exitCode(); } return a.exec(); }

优点:代码量少,依赖系统工具,兼容性好。
注意:确保系统已安装pgrep(通常包含在procps包中)。

方法二:直接遍历/proc文件系统

通过Qt文件操作遍历/proc目录,读取每个进程的comm文件匹配进程名。

cpp

#include <QCoreApplication> #include <QDir> #include <QFile> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString processName = "your_process_name"; // 替换为实际进程名 int count = 0; QDir procDir("/proc"); // 遍历/proc下的所有目录 QStringList entries = procDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); for (const QString &entry : entries) { bool isPid = false; entry.toInt(&isPid); // 检查是否为数字目录(进程ID) if (isPid) { QString commPath = QString("/proc/%1/comm").arg(entry); QFile commFile(commPath); if (commFile.open(QIODevice::ReadOnly)) { QString comm = commFile.readLine().trimmed(); // 读取进程名 if (comm == processName) { count++; } commFile.close(); } } } qDebug() << "Number of processes:" << count; return a.exec(); }

优点:不依赖外部命令,直接操作文件系统。
注意:需确保程序有权限访问/proc目录(普通用户通常可读)。

两种方法对比

方法优点注意事项
pgrep命令代码简洁,执行效率高需系统安装pgrep工具
遍历/proc无需外部依赖,跨平台潜力需处理文件权限,性能略低

实际使用建议

  1. 优先使用pgrep方法:在Linux环境下,系统命令通常更高效可靠。
  2. 处理特殊情况:如进程名包含空格或特殊字符,需在代码中正确转义。
  3. 错误处理:添加异常捕获(如文件打开失败、命令执行错误)。

通过上述任一方法,均可实现在Ubuntu下用Qt C++统计指定进程名的运行数量。根据具体需求选择合适方案即可。

2.process.readAllStandardOutput()

在Qt中,process.readAllStandardOutput()QProcess类的方法,用于读取子进程的标准输出(Standard Output)。结合你之前的代码场景(通过pgrep统计进程数量),以下是关键点解析和注意事项:

函数作用

  • 读取标准输出:当子进程(如pgrep命令)执行时,其输出到标准输出的内容会被QProcess捕获。
  • 返回二进制数据:返回QByteArray类型,需转换为字符串或进一步处理(如trimmed()去除两端空白)。

代码中的典型用法

cpp

process.start("pgrep", QStringList() << "-c" << processName); process.waitForFinished(); // 等待进程结束 QByteArray output = process.readAllStandardOutput().trimmed(); // 读取输出

潜在问题与解决方案

  1. 输出为空
    • 原因:命令未执行成功(如pgrep未安装、进程名不存在)。
    • 检查

      cpp

      if (process.exitStatus() == QProcess::CrashExit) { qDebug() << "Command crashed!"; } if (process.exitCode() != 0) { qDebug() << "Exit code:" << process.exitCode(); }
  2. 输出包含错误信息
    • 原因:命令执行错误(如权限不足、参数错误)。
    • 处理:同时读取标准错误输出:

      cpp

      1QByteArray error = process.readAllStandardError().trimmed(); 2if (!error.isEmpty()) { 3 qDebug() << "Error output:" << error; 4}
  3. 输出非数字内容
    • 原因pgrep -c在无匹配进程时可能返回空字符串或错误信息。
    • 防御性转换

      cpp

      1bool ok; 2int count = output.toInt(&ok); 3if (!ok) { 4 qDebug() << "Invalid output:" << output; 5}

最佳实践建议

  1. 超时控制:避免waitForFinished()无限阻塞,可设置超时时间:

    cpp

    1if (!process.waitForFinished(5000)) { // 5秒超时 2 qDebug() << "Process timed out!"; 3}
  2. 实时读取输出:对于长时间运行的进程,使用信号槽机制实时读取输出:

    cpp

    1QObject::connect(&process, &QProcess::readyReadStandardOutput, [&]() { 2 QByteArray chunk = process.readAllStandardOutput(); 3 // 处理数据块 4});
  3. 跨平台兼容性:若需兼容非Linux系统,可封装平台检测:

    cpp

    1#ifdef Q_OS_LINUX 2// 使用pgrep 3#else 4// 备选方案(如遍历任务管理器) 5#endif

调试技巧

  • 打印原始输出:在开发阶段,直接打印输出内容以验证命令行为:

    cpp

    1qDebug() << "Raw output:" << output;
  • 模拟命令:在终端手动执行pgrep -c your_process_name,对比输出与代码行为。

通过以上方法,可确保readAllStandardOutput()的可靠使用,并正确解析pgrep的输出结果。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 20:16:11

56、尘螨研究:从历史到现代的多维度探索

尘螨研究:从历史到现代的多维度探索 尘螨是一种常见的室内生物,它们与人类的健康息息相关。本文将从多个方面探讨尘螨研究的现状和未来方向,包括尘螨的历史变迁、与气候的关系、在不同环境中的分布以及控制策略等。 1. 尘螨的历史变迁:通过考古学的视角 尘螨的历史可以追…

作者头像 李华
网站建设 2026/6/8 20:07:47

Open-AutoGLM和DeepSeek究竟有何不同:从训练数据到推理效率的全方位拆解

第一章&#xff1a;Open-AutoGLM和DeepSeek的宏观定位差异Open-AutoGLM 与 DeepSeek 是当前大模型生态中两个具有代表性的技术体系&#xff0c;尽管均聚焦于生成式人工智能&#xff0c;但二者在设计哲学、应用场景和技术路径上存在显著差异。这种差异不仅体现在架构实现层面&am…

作者头像 李华
网站建设 2026/6/8 20:06:18

springboot基于web的网上摄影工作室的开发与实现(11577)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2026/6/9 1:48:22

Keil uVision5安装教程:软件下载与校验完整性指南

Keil uVision5 安装实战指南&#xff1a;从零构建安全可靠的嵌入式开发环境 你有没有遇到过这样的情况&#xff1f; 刚下载完 Keil uVision5 的安装包&#xff0c;双击运行却提示“无法解压”、“缺少 DLL 文件”&#xff0c;甚至杀毒软件突然报警说检测到木马。更糟的是&…

作者头像 李华
网站建设 2026/6/9 19:51:00

Python Set使用指南:高效去重与成员检查的秘诀

在Python编程中&#xff0c;集合&#xff08;set&#xff09;是一个基础且强大的数据结构&#xff0c;主要用于存储无序的唯一元素。理解其特性和应用场景&#xff0c;能有效解决去重、成员关系测试等问题&#xff0c;并提升代码效率。本文将具体探讨几个开发者常遇到的疑问&am…

作者头像 李华