【问题标题】:How to check CPU name, model, speed on Windows/Linux C?如何在 Windows/Linux C 上检查 CPU 名称、型号、速度?
【发布时间】:2013-09-06 16:56:06
【问题描述】:

我想用 C 获得一些关于硬件的信息:

  1. 我有多少 CPU
  2. 每个内核有多少个内核
  3. 每个 CPU 中每个核心有多少个逻辑核心
  4. CPU 名称 + 型号
  5. CPU 速度 + 频率
  6. CPU 架构(x86、x64)

我知道在类似 Linux 的操作系统上我可以解析 /proc/cpuinfo 但由于它不是普通文件,我认为它不安全。在 SO 上看到 this 的答案,但它并没有给我我需要的所有信息。我应该调用cat /proc/cpuinfo > file.txt 然后解析file.txt 吗?我知道cpuid.h(我正在使用 GCC),但找不到任何关于此标头的文档(无论如何 - 使用它是个好主意吗?)

【问题讨论】:

  • “不安全”是什么意思?

标签: c linux cpu cpu-architecture cpu-speed


【解决方案1】:

对于 Windows,您需要 GetSystemInfo 函数; Microsoft has an example。在 Linux 上,/proc/cpuinfo 是完全“安全的”,不管这意味着什么,但已经有 an answer to this question

【讨论】:

  • 如果您的应用是 32 位应用,请调用 GetNativeSystemInfo。
【解决方案2】:

Linux procfs 的假文件可能会出现很多问题。内核错误地将它们报告为常规文件,但它们的行为不像符合 POSIX 系统上的常规文件所必需的那样。例如,请参阅http://www.openwall.com/lists/musl/2013/05/05/9。我怀疑你听说过类似的报道,这就是你担心的地方。

话虽如此,据我所知,/proc 中虚假“常规文件”的所有不良行为仅与写作有关。对于阅读,它们的行为应该与实际的常规文件非常相似,您可以随心所欲地阅读它们而不必担心。

【讨论】:

    【解决方案3】:

    如果你只关心与英特尔兼容的 CPU,你可以使用汇编指令

    cpuid
    

    作为内联 asm 或作为单独的 asm 对象文件。

    例如,要检查供应商,您将使用函数 0:

    xor eax, eax  ; load eax with function 0
    cpuid         ; call cpuid
    

    现在供应商 ID 位于寄存器 ebx, ecx, edx 中。存在类似的函数来读取所有其他信息。

    更多信息请阅读this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 2018-06-01
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      相关资源
      最近更新 更多