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");
相关推荐
kdxiaojie13 分钟前
Linux 驱动研究 —— V4L2 (2)
linux·运维·笔记·学习
DB哥讲数据库14 分钟前
MySQL 8.4 安装教程:超详细图文讲解(附mysql安装包)
linux·数据库·mysql·centos
xlxxy_21 分钟前
sap获取批次特性报表
java·linux·开发语言·前端·数据库·abap·mm
木卫二号Coding41 分钟前
CentOS 系统 Shell 脚本开机自启动方法详解
linux
l1t1 小时前
DeepSeek总结的RegreSQL 2.0测试通过了。计划却没通过。
linux·数据库·postgresql
蝶恋舞者1 小时前
怎样设置软件开机自启动(用的最多,最简单)
linux·运维·服务器
Dawn-bit1 小时前
Linux打包压缩与用户权限管理详解
linux·服务器·数据库
ls_elect1 小时前
PostgreSQL 18.4 SCRAM-SHA-256 认证故障诊断及修复办法
linux·数据库·postgresql
陈同学xxx2 小时前
Hermes Agent 接入飞书,在手机上随时聊天
linux·python·飞书
网络小白不怕黑2 小时前
14.VSFTP服务相关配置
linux·运维·服务器