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");
相关推荐
KAI丶3 小时前
【Https】Received fatal alert: internal_error
https·1024程序员节
摇滚侠3 小时前
全面掌握PostgreSQL关系型数据库,备份和恢复,笔记46和笔记47
java·数据库·笔记·postgresql·1024程序员节
喜欢吃燃面4 小时前
数据结构算法题:list
开发语言·c++·学习·算法·1024程序员节
Dlkoiw4 小时前
Slotted Aloha
matlab·1024程序员节·aloha·slotted aloha
。TAT。4 小时前
C++ - 多态
开发语言·c++·学习·1024程序员节
DreamLife☼4 小时前
Node-RED革命性实践:从智能家居网关到二次开发,全面重新定义可视化编程
mqtt·网关·低代码·智能家居·iot·1024程序员节·node-red
AI视觉网奇4 小时前
json 可视化 2025 coco json
python·1024程序员节
寂静山林4 小时前
UVa 12991 Game Rooms
算法·1024程序员节
【非典型Coder】4 小时前
CompletableFuture线程池使用
1024程序员节