news 2026/6/10 20:45:45

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/10 13:44:08

如何在Kubernetes上稳定运行Open-AutoGLM?一线工程师亲述实战经验

第一章&#xff1a;Open-AutoGLM云部署的挑战与整体架构在将 Open-AutoGLM 这类大型语言模型部署至云端时&#xff0c;面临的核心挑战包括高并发请求处理、GPU资源调度效率、模型加载延迟以及跨服务通信稳定性。为应对这些问题&#xff0c;系统采用微服务化架构&#xff0c;将模…

作者头像 李华
网站建设 2026/6/10 14:56:43

Python 数据可视化打造精美图表的完整指南

一、核心可视化库概览 1. Matplotlib:基础与自由度的完美平衡 Matplotlib是Python可视化的基石,提供了无与伦比的自定义能力。虽然默认样式较为朴素,但通过精心调整,可以创造出版级质量的图表。 核心优势: 完全控制图表的每个元素 支持多种输出格式(PNG、PDF、SVG等)…

作者头像 李华
网站建设 2026/6/10 15:06:13

57、尘螨家族:Pyroglyphidae科的详细解析

尘螨家族:Pyroglyphidae科的详细解析 1. Pyroglyphidae科概述 Pyroglyphidae科于1958年由Cunliffe建立,其下包含多个属和物种。该科下有亚科PYROGLYPHINAE和DERMATOPHAGOIDINAE等。 2. PYROGLYPHINAE亚科 Asiopyroglyphus属 模式种 :Asiopyroglyphus thailandicus。 …

作者头像 李华
网站建设 2026/6/10 7:47:48

Dify如何实现多源数据融合生成综合报告?

Dify如何实现多源数据融合生成综合报告&#xff1f; 在企业智能化转型的浪潮中&#xff0c;一个现实而棘手的问题正日益凸显&#xff1a;数据越来越多&#xff0c;但真正能用的信息却越来越少。市场部门堆积如山的PDF调研报告、CRM系统里沉睡的客户对话记录、数据库中不断更新的…

作者头像 李华
网站建设 2026/6/10 10:01:18

【Open-AutoGLM高效集成秘籍】:快速对接企业系统的4种方法

第一章&#xff1a;Open-AutoGLM高效集成概述Open-AutoGLM 是一个面向自动化自然语言处理任务的开源框架&#xff0c;旨在通过模块化设计和高性能推理引擎实现大语言模型的快速集成与部署。该框架支持多种后端模型加载方式&#xff0c;并提供统一的API接口&#xff0c;便于开发…

作者头像 李华
网站建设 2026/6/10 13:19:53

【大模型开发效率提升300%】:Open-AutoGLM自动化推理优化全揭秘

第一章&#xff1a;Shell脚本的基本语法和命令 Shell脚本是Linux/Unix系统中自动化任务的核心工具&#xff0c;它通过解释执行一系列命令实现复杂操作。编写Shell脚本时&#xff0c;通常以“shebang”开头&#xff0c;用于指定解释器路径。 脚本的起始声明 所有Shell脚本应以如…

作者头像 李华