如何使用 C 在 QT 应用程序中获取处理器制造商 ID

Posted

技术标签:

【中文标题】如何使用 C 在 QT 应用程序中获取处理器制造商 ID【英文标题】:How to get Processor manufacturer ID in QT application using C 【发布时间】:2019-05-25 09:54:25 【问题描述】:

谁能帮我在使用 C 编程语言的 Qt 应用程序中读取处理器制造商 ID。

这是我试过的代码:

#include <stdio.h>
int main()

    system("sudo dmidecode");

我不能用这个,因为:

它在 QT 应用程序中不起作用 我想将此信息存储在 qt 应用程序的文件中。

有人可以建议我以其他方式使用 Qt 应用程序将处理器信息存储在辅助文件中吗?

【问题讨论】:

Getting the machine serial number and CPU ID using C/C++ in Linux的可能重复 使用 QT 你确定它不在 C++ 中吗?但是在 C 和 C++ 中方法是相同的 是的,但是在 qt system() 函数中不起作用,你能帮我用 qt 应用程序实现同样的事情吗 @Gagandeep 我的答案适用于 C 和 C++,包括在 Qt 下,其中的第一个提案只使用标准 C 函数 【参考方案1】:

如果你想把它存储到一个文件中,这很容易。

您需要以您想要的方式解析/proc/cpuinfo 的输出并将输出重定向到文件。您可以使用简单的命令行工具来完成此操作,例如 grepcut(以及许多其他工具)。

然后你会得到这样的一行。

system("cat /proc/cpuinfo | grep something > output_file");

还有其他更好的方法可以做到这一点,例如您可能想要查看的libcpuid。

【讨论】:

看来你必须学习 popen 的存在,写在一个文件中很可惜 ;-) (我在我的回答中使用它) 你能告诉我在ubuntu中安装libcpuid库的过程 OP : github 页面包含运行它所需的一切。 @bruno 我确实知道 popen 存在,我只是想根据他的代码向他展示一个答案。你的回答肯定比我的详细。赞一个!【参考方案2】:

读取文件 /proc/cpuinfo 并查看包含“型号名称”的行(至少对于 Debian / CentOS / OpenSuse,检查您的 Linux)

我的树莓派上的示例:

pi@raspberrypi:/tmp $ cat /proc/cpuinfo 
processor   : 0
model name  : ARMv7 Processor rev 4 (v7l)
BogoMIPS    : 38.40
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part    : 0xd03
CPU revision    : 4

processor   : 1
model name  : ARMv7 Processor rev 4 (v7l)
BogoMIPS    : 38.40
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part    : 0xd03
CPU revision    : 4

processor   : 2
model name  : ARMv7 Processor rev 4 (v7l)
BogoMIPS    : 38.40
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part    : 0xd03
CPU revision    : 4

processor   : 3
model name  : ARMv7 Processor rev 4 (v7l)
BogoMIPS    : 38.40
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part    : 0xd03
CPU revision    : 4

Hardware    : BCM2835
Revision    : a020d3
Serial      : 000000003a871273

CentOS下的例子:

[bruno@localhost ~]$ cat /proc/cpuinfo 
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 42
model name  : Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
stepping    : 7
cpu MHz     : 3409.658
cache size  : 8192 KB
physical id : 0
siblings    : 8
core id     : 0
cpu cores   : 8
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes xsave avx hypervisor lahf_lm
bogomips    : 6819.31
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor   : 1
vendor_id   : GenuineIntel
cpu family  : 6
model       : 42
model name  : Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
...

例如:

#include <stdio.h>
#include <string.h>

int main()

  FILE * fp = fopen("/proc/cpuinfo", "r");

  if (fp == 0)
    fprintf(stderr, "cannot open /proc/cpuinfo !");
  else 
    char line[256];

    while (fgets(line, sizeof(line), fp) != NULL) 
      if (strncmp(line, "model name", 10) == 0) 
        char * model = strchr(line, ':');

        if (model != NULL) 
          model += (model[1] == ' ') ? 2 : 1;
          fputs(model, stdout);
        

        break;
      
    
    fclose(fp);
  

  return 0;

编译和执行:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
ARMv7 Processor rev 4 (v7l)

或者如果你很懒不想自己解析:

#include <stdio.h>

int main()

  FILE * fp = popen("grep model /proc/cpuinfo | head | awk -F: 'print $2'", "r");

  if (fp != NULL) 
    char line[256];

    if (fgets(line, sizeof(line), fp)) 
      char * model = (*line == ' ') ? line + 1 : line;

      fputs(model, stdout);
    

    pclose(fp);
  

  return 0;

请注意,在这两种情况下,模型都包含换行符,这些解决方案与任何 CPU 兼容。

【讨论】:

user:~$ gcc -Wall -Wextra dmidecode.c -o dmidecode user:~$ ./dmidecode 60 (这个 o/p 得到了你能告诉我什么是 60?)跨度> 我想要处理器制造商ID号,我们可以通过在linux中执行命令sudo dmidecode得到。你能帮我做同样的事情吗 @Gagandeep 你从哪里得到 dmidecode.c ?在我的 raspberrypi 上,标准命令 dmidecode 不返回信息,这就是我没有谈论它并阅读 /proc/cpuinfo 的原因。您是否查看了副本,可能某些答案与您的情况兼容(某些答案假设为 intel cpu) 是的,您的代码正在运行,但我想要处理器制造商 ID。你能帮我读一下处理器制造商ID吗 @Gagandeep 你为什么不喜欢这个型号?这是一种与所有处理器兼容的单独方式。您是否只关注某些处理器?如果您不提供更多详细信息,则无法为您提供更多帮助...

以上是关于如何使用 C 在 QT 应用程序中获取处理器制造商 ID的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++\Qt 从当前窗口中获取选定的文本

QT打开一个网页,并获取网页内容,该怎么处理

写了一个QT程序和一个C程序,如何把QT程序里发出的QByteArray类型数据,让C程序接收到或者是处理识别?

QT中cin的处理

C语言怎么取CPU的各项信息?

如何使用Qt和C ++的“接口类”来传递两个线程