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

Qt QProcess基于Linux的命令管道符号无效问题【已解决】

QProcess基于Linux的命令管道符号无效问题

  • 一、问题描述
  • 二、解决方案
    • 2.1 问题原因
    • 2.2 解决方案
  • 三、例程
    • 3.1 解决方案例程
    • 3.2 官方例程

一、问题描述

  • 基于Linux环境,在Qt中使用QProcess start带管道符号|的命令,无异常但不会得到预期结果,将命令复制到终端中执行正常。代码如下所示:
    QString cmd = QString("命令1 | 命令2");qDebug() << cmd;process.start(cmd);

Linux管道符号|用于将前一个命令的输出作为后一个命令的输入,实现命令间的数据传递。它属于匿名管道(Anonymous Pipe),仅在内存中创建,作为临时通道,不依赖磁盘文件,且数据从左到右流动,不可逆向。管道主要用于组合简单命令,实现复杂的数据处理流程。

  • Linux命令之通配符&管道符:https://cloud.tencent.com/developer/article/2356665
  • Linux进程间通信——匿名管道:https://cloud.tencent.com/developer/article/2468685
  • 深入解析Linux匿名管道机制与应用:https://blog.csdn.net/2302_80871796/article/details/149539214

二、解决方案

2.1 问题原因

QProcess是Qt框架中用于启动外部程序并与它们交互的类,只能启动一个进程,输入"命令1 | 命令2",QProcess只能识别命令1,无法识别管道符号,会将| 命令2识别成命令1的参数。

2.2 解决方案

以下是解决方案:

    1. 调用bash,将上述代码的QString("命令1 | 命令2")替换为QString("bash -c \"命令1 | 命令2\"")
    1. 运行两次两次QProcess…
    1. QProcess进阶用法,使用process.setStandardOutputProcess(&xxx);函数
  • QProcess使用命令管道符号:https://wenku.csdn.net/answer/2qx6r9o56m
  • 使用QProcess的管道(或命令链):https://cloud.tencent.com/developer/ask/sof/110441190

三、例程

3.1 解决方案例程

    1. 调用bash
#include <QCoreApplication>
#include <QProcess>
#include <QDebug>int main(int argc, char *argv[])
{QProcess process;QString tar_cmd = QString("bash -c \"cat Makefile | grep LIB > cs.txt \"");qDebug() << tar_cmd;process.start(tar_cmd);if (!process.waitForStarted()){qDebug() << "start failed";return false;}if (!process.waitForFinished(-1)){qDebug() << "run failed" << process.errorString();return false;}}
    1. 调用两次QProcess,省略
    1. 使用process.setStandardOutputProcess(&xxx);函数
#include <QCoreApplication>
#include <QProcess>
#include <QDebug>int main(int argc, char *argv[])
{QProcess process1;QProcess process2;process1.setStandardOutputProcess(&process2);process1.start("cat Makefile");process2.setProcessChannelMode(QProcess::ForwardedChannels);process2.start("bash -c \"grep LIB > cs.txt\"");if(!process1.waitForStarted())return 0;process1.waitForFinished();process2.waitForFinished();
}

3.2 官方例程

官方文档:void QProcess::setStandardOutputProcess(QProcess *destination) - 这个函数是在Qt 4.2中引入

  • 将此进程的标准输出流通过管道传输到目标进程的标准输入。
    带管道的Shell命令 command1 | command2,可以使用QProcess通过以下代码完成:
  QProcess process1;QProcess process2;process1.setStandardOutputProcess(&process2);process1.start("command1");process2.start("command2");
http://www.dtcms.com/a/525814.html

相关文章:

  • 兰州网站优化服务网站建设jsp
  • alex网站建设个人做旅游网站的意义
  • 招商网站建站网络营销怎么做有特色
  • 光储微电网离网+并网MATLAB仿真模型
  • 三级管和mos管给击穿的原因
  • 网站网站环境搭建教程深圳提供网站建设服务平台
  • 国外网站模版镇江发展
  • LeetCode 39. 组合总和
  • 金融审核网站制作重庆做网站制作的公司
  • 网上书城网站开发设计家官网视频
  • 新网站应该怎么做seo网站自建设需要买什么手续
  • 医科+AI教学转型,和鲸智学一体机助力培养懂数据、通方法、能解决实际问题的复合型人才
  • 园林网站源代码公关公司和广告公司的区别
  • 设计师关注的十大网站和田哪里有做网站的地方
  • 网站支持asp手游源码资源网
  • 网站外链建设可以提升网站权重对还是错织梦系统怎么做网站
  • 解决cesium标牌和label背景图片不清晰的问题
  • 吉安网站建设jxthw如何在虚拟机中建设网站
  • 单节点部署TiDB 8.5.0
  • PaddleOCR-VL实测与思考
  • 网站的域名证书网站建设属于商标哪个类
  • 东莞阳光网站网站内容页相关性怎么做
  • 星光不负 码向未来|我的HarmonyOS学习之路与社区成长故事
  • 大气网站背景东莞seo排名优化服务
  • 人工智能2025
  • 高端网站建设推来客网络咨询类网站模板
  • 反向传播通过 “综合损失” 协调权重调整,比如100张图像,狗33张,猫33张,鸟34张,是训练每一张图像每次都反向传播?还是训练完100张图像反向传播?
  • 我局在网站建设方面广东网络营销是什么
  • 遵义网站建设哪家强wordpress 邮件美化
  • 哪家公司做网站便宜网店推广方案范文