initial commit
This commit is contained in:
53
sb-cpu.c
Normal file
53
sb-cpu.c
Normal file
@@ -0,0 +1,53 @@
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
typedef struct {
|
||||
long long idle;
|
||||
long long total;
|
||||
} cpu_stats_t;
|
||||
|
||||
static int read_cpu_stats(cpu_stats_t *stats) {
|
||||
FILE *fp = fopen("/proc/stat", "r");
|
||||
if (!fp)
|
||||
return 1;
|
||||
|
||||
long long user, nice, system, idle, iowait, irq, softirq;
|
||||
int ret = fscanf(fp, "cpu %lld %lld %lld %lld %lld %lld %lld", &user, &nice,
|
||||
&system, &idle, &iowait, &irq, &softirq);
|
||||
fclose(fp);
|
||||
|
||||
if (ret != 7)
|
||||
return 1;
|
||||
|
||||
stats->idle = idle + iowait;
|
||||
stats->total = user + nice + system + idle + iowait + irq + softirq;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static double calculate_usage(cpu_stats_t *prev, cpu_stats_t *curr) {
|
||||
long long diff_total = curr->total - prev->total;
|
||||
long long diff_idle = curr->idle - prev->idle;
|
||||
|
||||
if (diff_total == 0)
|
||||
return 0.0;
|
||||
return 100.0 * (diff_total - diff_idle) / diff_total;
|
||||
}
|
||||
|
||||
int main() {
|
||||
cpu_stats_t prev, curr;
|
||||
|
||||
if (read_cpu_stats(&prev) < 0) {
|
||||
fprintf(stderr, "Error reading CPU stats\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
sleep(1);
|
||||
|
||||
if (read_cpu_stats(&curr) < 0) {
|
||||
fprintf(stderr, "Error reading CPU stats\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("CPU: %.0f%%\n", calculate_usage(&prev, &curr));
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user