• qt获取cmd系统指令返回值的三种方法,支持windows和linux


    这里介绍三种不同获取cmd指令的方法,且都支持windows和linux。
    方法一(使用QProcess的异步方式来实现):
    这里通过QProcess信号槽来实现异步的获取返回值,使用start()来执行才行,如果你用startDetached()执行会把进程分离出去,是无法获取它的状态的。
    注意,这里有一个坑,qt无法执行带管道"|“和重定向”>>"的linux指令,需要写入脚本的方式来执行。
    这里提供了带管道和不带管道的linux指令执行方法

        //方法一:
        QProcess *p = new QProcess(this);
        connect(p,SIGNAL(finished(int)),this,SLOT(slotFinish(int)));
    
        ///注意,这里有一个坑,qt无法执行带管道"|"和重定向">>"的linux指令,需要写入脚本的方式来执行。
        ///这里提供了带管道和不带管道的linux指令执行方法
    #if 1 //带管道
        QString cmd = "ps -ef|ls -l";
        p->start("bash",QStringList()<<"-c"<start(cmd);
    #endif
    
    void Widget::slotFinish(int val)
    {
        QProcess *p = qobject_cast(sender());
        qDebug()<<"cmd finish"<readAllStandardOutput();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    方法二(QProcess同步方式来获取返回值):
    waitForStarted()默认30s,设置-1会一直等待执行完毕。

        //方法二:
        QProcess p1;
        ///注意,这里有一个坑,qt无法执行带管道"|"和重定向">>"的linux指令,需要写入脚本的方式来执行。
        ///这里提供了带管道和不带管道的linux指令执行方法
    #if 1 //带管道
        QString cmd = "ps -ef|ls -l";
        p1.start("bash",QStringList()<<"-c"<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    方法三(使用popen的IO接口来实现的):
    这里提供两种不同写法。
    写法一:

    void Widget::executeCMD(const char *cmd, char *result)
    {
        char buf_ps[1024];
        char ps[1024]={0};
        FILE *ptr;
        strcpy(ps, cmd);
    #ifdef Q_OS_LINUX  //支持LINUX
        if((ptr=popen(ps, "r"))!=NULL)
        {
            while(fgets(buf_ps, 1024, ptr)!=NULL)
            {
               strcat(result, buf_ps);
               if(strlen(result)>1024)
                   break;
            }
            pclose(ptr);
            ptr = NULL;
        }
        else
        {
            printf("popen %s error", ps);
        }
    #else      //支持windows系统
        if((ptr=_popen(ps, "r"))!=NULL)
        {
            while(fgets(buf_ps, 1024, ptr)!=NULL)
            {
               strcat(result, buf_ps);
               if(strlen(result)>1024)
                   break;
            }
            _pclose(ptr);
            ptr = NULL;
        }
        else
        {
            printf("popen %s error", ps);
        }
    #endif
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    调用方式:

        //方法3
        QString cmd = "ps -ef|ls -l";
        char result[1024];
        executeCMD(cmd.toStdString().data(),result);
        qDebug()<<"cmd finish"<
    • 1
    • 2
    • 3
    • 4
    • 5

    写法二:

    QString Widget::getCmdResult(const QString &strCmd)
    {
        char buf[10240] = {0};
        FILE *pf = NULL;
    
    #ifdef Q_OS_LINUX  //支持LINUX
        if( (pf = popen(strCmd.toStdString().c_str(), "r")) == NULL )
        {
            return "";
        }
    #else               //支持windows系统
        if( (pf = _popen(strCmd.toStdString().c_str(), "r")) == NULL )
        {
            return "";
        }
    #endif
    
        std::string strResult;
        while(fgets(buf, sizeof buf, pf))
        {
            strResult += buf;
        }
    
    #ifdef Q_OS_LINUX  //支持LINUX
        pclose(pf);
    #else              //支持windows系统
        _pclose(pf);
    #endif
    
        unsigned int iSize =  strResult.size();
        if(iSize > 0 && strResult[iSize - 1] == '\n')
        {
            strResult = strResult.substr(0, iSize - 1);
        }
    
        return QString::fromLocal8Bit(strResult.c_str());
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    调用方式:

        //方法3
        QString cmd = "ps -ef|ls -l";
        qDebug()<<"cmd finish"<
  • 相关阅读:
    分享从零开始学习网络设备配置--任务2.6 避免网络环路
    Tomcat部署(手动建立文件夹的形式)
    Django 里如何使用 sqlite (操作步骤)
    记录一次关于嵌套事务传播机制的bug
    react中reducer+上下文实战
    OpenCV-Python小应用(六):车道线检测
    LeetCode - 解题笔记 - 216 - Combination Sum III
    k8s helm 删除 tiller
    腾讯不被看好?Prosus宣布减持股份,中国科技公司路在何方?
    JMeter进行并发测试&参数化
  • 原文地址:https://blog.csdn.net/weixin_43246170/article/details/127902551