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

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

一、问题描述

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

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

二、解决方案

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);函数

三、例程

3.1 解决方案例程

    1. 调用bash
cpp 复制代码
#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);函数
cpp 复制代码
#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通过以下代码完成:
cpp 复制代码
  QProcess process1;
  QProcess process2;
  process1.setStandardOutputProcess(&process2);
  process1.start("command1");
  process2.start("command2");
相关推荐
123过去1 小时前
ike-scan使用教程
linux·测试工具
疯狂吧小飞牛8 小时前
GPG基础指令
linux·服务器·网络
C++ 老炮儿的技术栈8 小时前
volatile使用场景
linux·服务器·c语言·开发语言·c++
todoitbo9 小时前
用虚拟局域网打通 Win/Mac/Linux 三端:跨设备协作的实用方案
linux·运维·macos
源远流长jerry9 小时前
RDMA 基本操作类型详解:从双端通信到单端直访
linux·网络·tcp/ip·ip
Sylvia-girl10 小时前
Linux下的基本指令1
linux·运维·服务器
wyt53142911 小时前
Redis的安装教程(Windows+Linux)【超详细】
linux·数据库·redis
17(无规则自律)11 小时前
【Linux驱动实战】:字符设备之ioctl与mutex全解析
linux·c语言·驱动开发·嵌入式硬件
娇娇yyyyyy12 小时前
QT编程(13): Qt 事件机制eventfilter
开发语言·qt
天赐学c语言12 小时前
Linux - 应用层自定义协议与序列/反序列化
linux·服务器·网络·c++