如何通过c语言实现Linux下的top命令来获取cpu利用率?

在 Linux 环境下,通过 C 语言实现类似于 top 命令的功能,以获取 CPU 利用率,涉及到读取和解析系统文件 /proc/stat,这是 Linux 内核提供的系统状态信息接口。以下是详细的步骤和示例代码。

实现步骤

  1. 读取 /proc/stat 文件

    • /proc/stat 文件中包含了系统的 CPU 使用信息。读取这个文件获取当前的 CPU 时间信息。
  2. 解析 CPU 时间信息

    • 该文件的第一行通常以 cpu 开头,后跟四个时间值:usernicesystemidle,分别表示用户态时间、优先级改变的时间、系统态时间和空闲时间。
  3. 计算 CPU 利用率

    • 获取两次采样的 CPU 时间信息,计算差值,得出 CPU 利用率。利用率 = (总使用时间 - 空闲时间) / 总时间 * 100%

示例代码

以下是一个示例 C 程序,用于实现上述功能:

c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define PROC_STAT_FILE "/proc/stat" // Function to read CPU statistics from /proc/stat void read_cpu_stats(unsigned long long *user, unsigned long long *nice, unsigned long long *system, unsigned long long *idle) { FILE *file = fopen(PROC_STAT_FILE, "r"); if (file == NULL) { perror("fopen"); exit(EXIT_FAILURE); } char buffer[256]; if (fgets(buffer, sizeof(buffer), file) == NULL) { perror("fgets"); fclose(file); exit(EXIT_FAILURE); } fclose(file); // Parse the line sscanf(buffer, "cpu %llu %llu %llu %llu", user, nice, system, idle); } // Function to calculate CPU usage percentage double calculate_cpu_usage(unsigned long long user1, unsigned long long nice1, unsigned long long system1, unsigned long long idle1, unsigned long long user2, unsigned long long nice2, unsigned long long system2, unsigned long long idle2) { unsigned long long total1 = user1 + nice1 + system1 + idle1; unsigned long long total2 = user2 + nice2 + system2 + idle2; unsigned long long total_used = (user2 - user1) + (nice2 - nice1) + (system2 - system1); unsigned long long total_time = total2 - total1; if (total_time == 0) return 0.0; return (double)total_used / total_time * 100.0; } int main() { unsigned long long user1, nice1, system1, idle1; unsigned long long user2, nice2, system2, idle2; // Read the first sample read_cpu_stats(&user1, &nice1, &system1, &idle1); sleep(1); // Wait for 1 second // Read the second sample read_cpu_stats(&user2, &nice2, &system2, &idle2); // Calculate CPU usage double cpu_usage = calculate_cpu_usage(user1, nice1, system1, idle1, user2, nice2, system2, idle2); printf("CPU Usage: %.2f%%\n", cpu_usage); return 0; }

解释

  1. read_cpu_stats 函数

    • 打开 /proc/stat 文件并读取第一行,该行包含了 CPU 时间信息。
    • 使用 sscanf 解析 CPU 使用时间,存储在 usernicesystemidle 变量中。
  2. calculate_cpu_usage 函数

    • 计算两个时间点之间的 CPU 使用情况。
    • 计算 total_used 为 CPU 的总使用时间,total_time 为总时间。
    • 使用公式 (total_used / total_time) * 100.0 计算 CPU 使用率。
  3. main 函数

    • 读取两次 CPU 时间信息,计算并输出 CPU 使用率。
    • sleep(1) 用于在两次采样之间等待 1 秒钟,以便计算出 CPU 利用率。

总结

以上代码展示了如何通过 C 语言在 Linux 下实现类似 top 命令的功能,获取 CPU 利用率。主要步骤包括读取和解析 /proc/stat 文件,计算 CPU 时间差值,以及计算 CPU 使用率。

关键字

C语言, Linux, /proc/stat, CPU 利用率, fopen, sscanf, sleep, 计算 CPU 使用率, 文件读取, 数据解析