You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows 11下用C编写简易系统监控工具的入门技术咨询

Windows下C语言实现简易系统监控入门指南

1. Windows平台下读取CPU和内存使用率的常用方法

  • CPU使用率:核心依赖Windows Kernel32库的GetSystemTimesAPI。通过两次调用该API,分别获取系统空闲时间、内核态时间、用户态时间的基准值和间隔后的数值,计算时间差值的占比,就能得到CPU使用率。如果需要单进程CPU数据,可搭配GetProcessTimesAPI。
  • 内存使用率:使用GlobalMemoryStatusExAPI,它会返回系统总物理内存、可用物理内存等关键数据,直接通过「(总内存-可用内存)/总内存」的公式就能算出使用率。
  • 注意:GCC编译时需链接kernel32.lib,添加编译参数-lkernel32

2. 最简示例代码

以下是能实时显示CPU和内存使用率的极简实现,适配Windows 11+GCC环境:

#include <stdio.h>
#include <windows.h>

// 计算CPU使用率
double get_cpu_usage() {
    FILETIME idle_time, kernel_time, user_time;
    FILETIME prev_idle, prev_kernel, prev_user;

    // 第一次获取时间基准
    GetSystemTimes(&idle_time, &kernel_time, &user_time);
    prev_idle = idle_time;
    prev_kernel = kernel_time;
    prev_user = user_time;

    // 等待1秒让数据产生有效差值
    Sleep(1000);

    // 第二次获取时间
    GetSystemTimes(&idle_time, &kernel_time, &user_time);

    // 转换为64位整数计算差值
    ULONGLONG idle_diff = ((ULONGLONG)idle_time.dwHighDateTime << 32) + idle_time.dwLowDateTime -
                          ((ULONGLONG)prev_idle.dwHighDateTime << 32) + prev_idle.dwLowDateTime;
    ULONGLONG total_diff = (((ULONGLONG)kernel_time.dwHighDateTime << 32) + kernel_time.dwLowDateTime +
                            ((ULONGLONG)user_time.dwHighDateTime << 32) + user_time.dwLowDateTime) -
                           (((ULONGLONG)prev_kernel.dwHighDateTime << 32) + prev_kernel.dwLowDateTime +
                            ((ULONGLONG)prev_user.dwHighDateTime << 32) + prev_user.dwLowDateTime);

    if (total_diff == 0) return 0.0;
    return 100.0 - (idle_diff * 100.0 / total_diff);
}

// 获取内存使用率
double get_memory_usage() {
    MEMORYSTATUSEX mem_info;
    mem_info.dwLength = sizeof(mem_info);
    GlobalMemoryStatusEx(&mem_info);

    ULONGLONG used_mem = mem_info.ullTotalPhys - mem_info.ullAvailPhys;
    return (used_mem * 100.0) / mem_info.ullTotalPhys;
}

int main() {
    printf("简易系统监控工具\n");
    printf("----------------\n");
    while (1) {
        double cpu_usage = get_cpu_usage();
        double mem_usage = get_memory_usage();
        // 用\r实现实时刷新同一行
        printf("CPU使用率: %.1f%% | 内存使用率: %.1f%%\r", cpu_usage, mem_usage);
        fflush(stdout);
    }
    return 0;
}

编译命令:gcc monitor.c -o monitor.exe -lkernel32

3. 初学者的合理第一步/小里程碑

  • 第一步:先单独实现内存使用率读取功能。内存读取仅需一次GlobalMemoryStatusEx调用,逻辑简单,能快速验证Windows API调用、编译链接流程是否正常,建立项目基础信心。
  • 首个小里程碑:完成CPU+内存使用率的实时显示功能(如上述示例),确保数据准确、程序稳定运行。之后再逐步扩展磁盘(用GetDiskFreeSpaceExAPI)、网络(用IP_ADAPTER_ADDRESSESAPI)等监控模块。

内容的提问来源于stack exchange,提问作者Codinguy

火山引擎 最新活动