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 ([email protected]) (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”
}’
參考引用
Interpreting output of cat/proc/cpuinfo
Piping (or command chaining) with QProcess