当前位置: 首页 > news >正文

关于 在国产麒麟系统上使用QProcess配合管道命令执行shell命令获取预期结果输出失败 的解决方法

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/126678079

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

Qt开发专栏:各种问题解决(点击传送门)

国产麒麟系统相关开发


问题

  在国产麒麟系统上使用QProcess配合管道命令获取输出结果失败。
  在这里插入图片描述  在这里插入图片描述
(PS:是不是麒麟特有的问题,笔者没有做对比了,有时间的读者可以对比下,并将输出结果留言,谢谢)


判断过程

  先修改:

    // 服务器没有起来则先启动服务器
    {
        QProcess p;
        p.setProcessChannelMode(QProcess::MergedChannels);   //设置读取标准输出模式
        p.start("ps -ef | grep xDisplayServer  | grep -v grep |wc -l");
        p.waitForFinished();
        LOG << QString(p.readAllStandardOutput());
        LOG << QString(p.readAll());
    }

  再次运行报错:
  在这里插入图片描述
  经过多次测试,发现不能使用管道符号”|“,否则无输出
  只执行”ps -ef“,则可以输出:
  在这里插入图片描述
  所以,这种方式可以直接在程序中去解析字符串,这种方式不能用管道,如果想用管道就需要使用另外一种方式:

QProcess p;
QStringList options;
options << "-c" << "ps -ef | grep xDisplayServer  | grep -v grep | wc -l";
p.waitForFinished();
p.waitForReadyRead();
LOG << QString(p.readAllStandardOutput());
LOG << QString(p.readAll());
p.close();

解决方法

  使用/bin/bash -c的方式,可以获取到输出。
  在这里插入图片描述
  最终代码

// 服务器没有起来则先启动服务器
{
    QProcess p;
    QStringList options;
    QString name = QString("%1").arg(ConfigManager::getInstance()->getListProcessName().at(0));
    options << "-c" << QString("ps -ef | grep %1  | grep -v grep | wc -l").arg(name);
    p.start("/bin/bash", options);
    p.waitForFinished();
    p.waitForReadyRead();
    QString str = QString(p.readAllStandardOutput());
    LOG << str;
    str = str.trimmed();
    LOG << str;
    int result = str.toInt();
    if(result == 0)
    {
        // 没有一个相关进程,服务没有启动,需要后台再启动一次
        LOG << "没有一个相关进程,服务没有启动,需要后台再启动一次";
        {
            // 搜索当前目录下第一个匹配关键字的程序,有的话就则启动,没有则忽略
            QProcess p;
            QStringList options;
            options << "-c" << QString("ls | grep %1").arg(name);
            p.start("/bin/bash", options);
            p.waitForFinished();
            p.waitForReadyRead();
            QString str = QString(p.readAllStandardOutput());
            p.close();
            QStringList listApp = str.split("\n", QString::SkipEmptyParts);
            if(listApp.size() <= 0)
            {
                LOG << "没有匹配到关键字" << name << "的应用";
            }else{
                LOG << "匹配到关键字" << name << "的应用" << listApp.at(0) << listApp;
                LOG << "启动" << listApp.at(0);
                QProcess::startDetached(listApp.at(0));
            }
        }
    }else{
        // 有超过1个相关进程,服务已经启动
        LOG << "有超过1个相关进程,服务已经启动";
    }
    p.close();
}

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/126678079

相关文章:

  • docker进阶——docker网络简解
  • 2022/09/01 day01:Git概述
  • 2022/09/02 day02:连接远程仓库,推送、克隆
  • 第18章linux系统-备份与恢复
  • 2022/09/03 day03:搭建私有git服务器与IDEA中使用Git
  • VScode+esp-idf:例程(esp32-web-camera)保存图片到sd卡
  • 读书笔记<高速上手C11 14 17>
  • Transformer,浅析归纳偏置对模型缩放的影响
  • 两款Java中小医院信息管理系统源码
  • CS:GO开服架设服务器搭建游戏配置方法教程教学插件配置下载资源配置
  • 微服务分布式架构中,如何实现优雅发版?
  • PCB电路设计规范细节
  • APS智能排产助力啤酒行业实施“利润优先”策略
  • 【JavaWeb】JDBC实战
  • 系统篇: squashfs 文件系统
  • 深入了解以太坊
  • 2017前端实习生面试总结
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • C学习-枚举(九)
  • github从入门到放弃(1)
  • gitlab-ci配置详解(一)
  • leetcode388. Longest Absolute File Path
  • mysql外键的使用
  • Solarized Scheme
  • Vue ES6 Jade Scss Webpack Gulp
  • Vue组件定义
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 半理解系列--Promise的进化史
  • - 概述 - 《设计模式(极简c++版)》
  • 诡异!React stopPropagation失灵
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 探索 JS 中的模块化
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​Python 3 新特性:类型注解
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (多级缓存)缓存同步
  • (翻译)terry crowley: 写给程序员
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)socket Aio demo
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net core 依赖注入的基本用发
  • .Net Core和.Net Standard直观理解
  • .NET NPOI导出Excel详解
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET导入Excel数据
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET项目中存在多个web.config文件时的加载顺序
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解