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?