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




