QProcess处理带管道的shell

24 篇文章 0 订阅


    代码中需要调用shell,原写法为:

    QProcess *proc = new QProcess();
    QString qCmd = "find ./ -name *.so -print0 | xargs -0 objdump -x | grep -oE \"T_[0-9, a-f, A-F]{4}\" ";

    proc->start(qCmd); 

    if (proc->waitForFinished(1000))
    {

        QByteArray qOutput = proc->readAllStandardOutput();
       QList<QByteArray> list = qOutput.split('\n');
        QList<QByteArray>::iterator itor = list.begin();

        for ( ; itor != list.end(); itor++)
        {
            QByteArray strline = *itor;
            qDebug() << strline;
        }

    }

    但输出结果一直为空,同样的shell语句,在终端中直接执行,输出结果非空。

    后在一博客中找到说法,问题出在概念没搞清,管道符是由shell进行解析处理的,上面的用法,相当于是两个shell命令,不能在一个QProcess中处理。

   QProcess需要处理带管道的shell时,需通过如下方法:

 

    QProcess *proc = new QProcess();
    QStringList options;

    options << "-c";
    options << "find ./ -name *.so -print0 | xargs -0 objdump -x | grep -oE \"T_[0-9, a-f, A-F]{4}\"";

    proc->start("/bin/bash", options);

QProcessQt框架中用于创建和管理子进程的类。它允许用户启动外部程序,并与这些程序的标准输入、标准输出和标准错误进行交互。如果在尝试使用QProcess启动shell时失败,可能有几个原因: 1. 环境问题:可能是因为环境变量没有正确设置,导致QProcess无法找到要启动的shell程序。例如,在Windows系统中,可能需要设置环境变量PATH,以包含可执行文件的目录。 2. 权限问题:如果程序需要特定的权限才能运行,而当前用户没有这些权限,那么启动进程可能会失败。 3. 路径问题:提供的程序路径不正确或程序文件不存在。如果路径错误或文件丢失,QProcess将无法启动shell。 4. 参数错误:传递给QProcess启动shell的参数可能不正确。例如,在某些操作系统中,需要提供正确的命令和参数格式。 5. 同步问题:在使用QProcess时,如果在进程还没准备好执行时就开始读写数据,可能会导致启动失败。 为了解决QProcess启动shell失败的问题,可以采取以下步骤进行调试: 1. 检查环境变量是否正确设置了必要的路径。 2. 检查程序文件是否存在,以及当前用户是否有执行该程序的权限。 3. 确保传递给QProcess的路径和参数格式正确无误。 4. 使用QProcess的错误输出功能,如QProcess::errorOccurred()信号,来获取失败的具体原因。 5. 确保在启动进程之前,QProcess对象已经完全配置好,并且在需要时调用了启动函数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值