C语言如何使用GetSystemInfo获取系统信息?

99ANYc3cd6
预计阅读时长 18 分钟
位置: 首页 C语言 正文

这是一个在 Windows 平台下非常常用的 API 函数,用于获取当前系统的各种信息,CPU 数量、页面大小、硬件架构等。

c语言 getsysteminfo
(图片来源网络,侵删)

函数概述

GetSystemInfo 函数用于填充一个 SYSTEM_INFO 结构体,该结构体包含了当前计算机系统的相关信息,这对于需要编写跨平台兼容性代码、进行性能优化或进行底层系统编程的开发者来说非常有用。

函数原型 (在 Windows.h 中定义):

VOID GetSystemInfo(
  [out] LPSYSTEM_INFO lpSystemInfo
);

参数说明:

  • lpSystemInfo: 指向一个 SYSTEM_INFO 结构体的指针,函数执行后,这个结构体的各个字段将被填充上系统的相关信息。
    • LPSYSTEM_INFOSYSTEM_INFO* 的别名,意思是“指向 SYSTEM_INFO 结构体的指针”。
    • [out] 表示这是一个输出参数,数据由函数写入。

返回值:

c语言 getsysteminfo
(图片来源网络,侵删)
  • 无返回值 (VOID),所有信息都通过 SYSTEM_INFO 结构体返回。

关头文件

在使用 GetSystemInfo 之前,必须包含 Windows SDK 的头文件:

#include <windows.h>

SYSTEM_INFO 结构体

这是 GetSystemInfo 函数的核心,它的定义如下(具体字段可能因 Windows 版本略有不同):

typedef struct _SYSTEM_INFO {
  union {
    DWORD dwOemId;         // 旧版Windows使用,现已废弃
    struct {
      WORD wProcessorArchitecture;
      WORD wReserved;
    } DUMMYSTRUCTNAME;
  } DUMMYUNIONNAME;
  DWORD     dwPageSize;                // 系统页面大小(字节)
  LPVOID    lpMinimumApplicationAddress; // 用户模式最小可用地址
  LPVOID    lpMaximumApplicationAddress; // 用户模式最大可用地址
  DWORD_PTR dwActiveProcessorMask;      // 活动处理器的掩码
  DWORD     dwNumberOfProcessors;       // 物理处理器的数量(逻辑核心数)
  DWORD     dwProcessorType;            // 处理器类型(已废弃,请使用wProcessorArchitecture)
  DWORD     dwAllocationGranularity;    // VirtualAlloc的分配粒度
  WORD      wProcessorLevel;            // 处理器级别(如型号)
  WORD      wProcessorRevision;         // 处理器修订版本
} SYSTEM_INFO, *LPSYSTEM_INFO;

常用字段解释:

  • dwPageSize: 系统内存分页的大小(4096 字节),在进行内存对齐操作时很有用。
  • lpMinimumApplicationAddress / lpMaximumApplicationAddress: 定义了当前进程可以使用的用户模式虚拟内存的地址范围,所有动态内存分配(如 malloc, VirtualAlloc)都会发生在这个范围内。
  • dwNumberOfProcessors: 系统中逻辑处理器的数量,这是进行多线程并行计算时决定创建多少个线程的重要参考。
  • wProcessorArchitecture: 一个 WORD 值,表示处理器的架构。
    • PROCESSOR_ARCHITECTURE_INTEL (0): x86
    • PROCESSOR_ARCHITECTURE_AMD64 (9): x64
    • PROCESSOR_ARCHITECTURE_ARM (5): ARM
    • PROCESSOR_ARCHITECTURE_ARM64 (12): ARM64
    • PROCESSOR_ARCHITECTURE_UNKNOWN (0xFFFF): 未知
  • dwActiveProcessorMask: 一个位掩码,每一位代表一个逻辑处理器,如果第 i 位为 1,表示第 i 个处理器是活动的,这个值可以用来将线程绑定到特定的核心。

代码示例

下面是一个完整的 C 语言示例,演示如何使用 GetSystemInfo 并打印出其主要信息。

#include <stdio.h>
#include <windows.h> // 必须包含此头文件
int main() {
    // 1. 声明一个 SYSTEM_INFO 结构体变量
    SYSTEM_INFO si;
    // 2. 调用 GetSystemInfo 函数填充结构体
    GetSystemInfo(&si);
    // 3. 打印结构体中的信息
    printf("--- System Information ---\n");
    // 打印处理器架构
    printf("Processor Architecture: ");
    switch (si.wProcessorArchitecture) {
        case PROCESSOR_ARCHITECTURE_INTEL:
            printf("x86\n");
            break;
        case PROCESSOR_ARCHITECTURE_AMD64:
            printf("x64\n");
            break;
        case PROCESSOR_ARCHITECTURE_ARM:
            printf("ARM\n");
            break;
        case PROCESSOR_ARCHITECTURE_ARM64:
            printf("ARM64\n");
            break;
        case PROCESSOR_ARCHITECTURE_UNKNOWN:
        default:
            printf("Unknown\n");
            break;
    }
    // 打印页面大小
    printf("Page Size: %u bytes\n", si.dwPageSize);
    // 打印处理器数量
    printf("Number of Processors (Cores): %u\n", si.dwNumberOfProcessors);
    // 打印内存分配粒度
    printf("Allocation Granularity: %u bytes\n", si.dwAllocationGranularity);
    // 打印内存地址范围
    printf("Minimum Application Address: %p\n", si.lpMinimumApplicationAddress);
    printf("Maximum Application Address: %p\n", si.lpMaximumApplicationAddress);
    // 打印处理器级别和修订版本
    printf("Processor Level: %u\n", si.wProcessorLevel);
    printf("Processor Revision: %u\n", si.wProcessorRevision);
    printf("--------------------------\n");
    return 0;
}

如何编译和运行 (使用 MinGW-gcc):

  1. 将代码保存为 getsysinfo.c
  2. 打开命令行或终端。
  3. 使用以下命令进行编译:
    gcc -o getsysinfo.exe getsysinfo.c
  4. 运行生成的可执行文件:
    .\getsysinfo.exe

示例输出 (在一台 x64 机器上):

--- System Information ---
Processor Architecture: x64
Page Size: 4096 bytes
Number of Processors (Cores): 8
Allocation Granularity: 65536 bytes
Minimum Application Address: 0000000000000000
Maximum Application Address: 00007FFFFFFFFFFF
Processor Level: 6
Processor Revision: 16404
--------------------------

重要注意事项

  1. 平台限制: GetSystemInfo 是 Windows 特有的 API,如果你需要编写跨平台的 C 代码(例如在 Linux 或 macOS 上也能运行),不能使用这个函数,在 Linux 上,你可以通过读取 /proc/cpuinfo 文件或使用 sysconf 函数来获取类似信息;在 macOS 上,可以使用 sysctl 函数。

  2. 获取更详细的 CPU 信息: GetSystemInfo 提供的是比较宏观的系统信息,如果你需要获取每个 CPU 核心的详细信息(如缓存大小、型号名称等),应该使用更高级的 API,如 GetLogicalProcessorInformation

  3. 线程亲和性 (Thread Affinity): dwActiveProcessorMask 字段可以用来实现线程亲和性,即强制某个线程只在特定的 CPU 核心上运行,这可以通过 Windows API SetThreadAffinityMask 来实现,有时可以用于性能调优。

  4. 版本兼容性: SYSTEM_INFO 结构体的定义在不同版本的 Windows 中可能略有增删。wProcessorLevelwProcessorRevision 是在较新的版本中引入的,但核心字段(如 dwPageSize, dwNumberOfProcessors)非常稳定。

-- 展开阅读全文 --
头像
C语言如何创建进度条?
« 上一篇 12-10
YouCompleteme C语言配置失败怎么办?
下一篇 » 12-10

相关文章

取消
微信二维码
支付宝二维码

目录[+]