Qt Linux下执行管道命令

3 篇文章 0 订阅
1 篇文章 0 订阅

Qt Linux下获取系统信息

由于QOperatingSystemVersion在linux系统下无效,所以我们需要重新实现下一些功能,比如系统版本、CPU、GPU信息等。我们使用linux下的shell来获取各种信息。

起初,我使用QProcess执行多条管道指令,例如

QString cmd = "cat file | grep string";
QProcess process;
process->start("cat file | grep string");
process->waitForFinished();
qDebug() << process->readAll();

这样是不行的,QProcess执行的是一个外部可执行文件,不能执行系统指令,这条指令有cat、grep两条通过管道输出的。我们可以把参数传递给bash来执行:

process.start(“bash”, QStringList() << “-c” << “cat file | grep string”);

或者添加引号:

process->start("/bin/sh -c “cat file | grep string”");

接下来我们就可以正常执行我们的指令了。

#include <QCoreApplication>
#include <QProcess>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QProcess process;
    process.start("/bin/bash", QStringList() << "-c" << "cat /etc/redhat-release");
    process.waitForFinished();
    QString output = process.readAllStandardOutput().trimmed();
    qDebug() << output;

    process.start("/bin/bash", QStringList() << "-c" << "cat /proc/cpuinfo | grep 'model name' | uniq | awk -F':' '{print $2}'");
    process.waitForFinished();
    output = process.readAllStandardOutput().trimmed();
    qDebug() << output;


    process.start("/bin/bash", QStringList() << "-c" << "uname -a");
    process.waitForFinished();
    output = process.readAllStandardOutput().trimmed();
    qDebug() << output;

    process.start("/bin/bash", QStringList() << "-c" << "cat /proc/version");
    process.waitForFinished();
    output = process.readAll().trimmed();
    qDebug() << output;

    process.start("/bin/bash", QStringList() << "-c" << "lspci | grep -i vga | awk -F':' '{print $3}'");
    process.waitForFinished();
    output = process.readAll().trimmed();
    qDebug() << output;


    process.start(R"(/bin/bash -c "cat /etc/redhat-release")");
    process.waitForFinished();
    output = process.readAllStandardOutput().trimmed();
    qDebug() << output;

    return a.exec();
}

执行结果如下:

"CentOS Linux release 7.6.1810 (Core)"
"Intel(R) Core(TM) i7-3770K CPU @ 3.50GHz"
"Linux localhost.localdomain 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux"
"Linux version 3.10.0-957.21.3.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Tue Jun 18 16:35:19 UTC 2019"
"VMware SVGA II Adapter"
"CentOS Linux release 7.6.1810 (Core)"

附上一条获取CPU信息的命令:

cat /proc/cpuinfo |
awk -v FS=’:’ ’
/^physical id/ { if(nb_cpu<$2) { nb_cpu=$2 } }
/^cpu cores/ { if(nb_cores<$2){ nb_cores=$2 } }
/^processor/ { if(nb_units<$2){ nb_units=$2 } }
/^model name/ { model=$2 }

END{
nb_cpu=(nb_cpu+1);
nb_units=(nb_units+1);

print “CPU model:”,model;
print nb_cpu,“CPU,”,nb_cores,“physical cores per CPU, total”,nb_units,“logical CPU units”
}’

自动输入密码

QProcess process1
QProcess process2;

process1.setStandardOutputProcess(&process2);

process1.start("echo myPass");
process2.start("sudo -S shutdown -r now");
process2.setProcessChannelMode(QProcess::ForwardedChannels);

// Wait for it to start
if(!process1.waitForStarted())
    return 0;

bool retval = false;
QByteArray buffer;
// To be fair: you only need to wait here for a bit with shutdown,
// but I will still leave the rest here for a generic solution
while ((retval = process2.waitForFinished()));
    buffer.append(process2.readAll());

if (!retval) {
    qDebug() << "Process 2 error:" << process2.errorString();
    return 1;
}

or

 process.startDetached("/bin/sh", QStringList()<< "-c" 
                       << "echo myPass | sudo -S shutdown -r now");

or

system("echo " + sudoPwd + " | sudo -S apt-get update");

参考引用

Interpreting output of cat/proc/cpuinfo
Piping (or command chaining) with QProcess
How to execute complex linux commands in Qt?

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值