cpu.c (1754B)
1 #include <stdio.h> 2 3 #define PREV_FILE_LOC "/tmp/cpu_c_previous" 4 5 typedef struct { 6 int total; 7 int idle; 8 } Values; 9 10 Values get_previous_values() { 11 FILE *f; 12 f = fopen(PREV_FILE_LOC, "r"); 13 if (f == NULL) { 14 Values prev_values; 15 prev_values.total = 0; 16 prev_values.idle = 0; 17 return prev_values; 18 } 19 char buf[100]; 20 fgets(buf, 100, f); 21 int total, idle; 22 sscanf(buf, "%d %d", &total, &idle); 23 Values prev_values; 24 prev_values.total = total; 25 prev_values.idle = idle; 26 fclose(f); 27 return prev_values; 28 } 29 30 void save_new_values(Values new_values) { 31 FILE *f; 32 f = fopen(PREV_FILE_LOC, "w"); 33 fprintf(f, "%d %d", new_values.total, new_values.idle); 34 fclose(f); 35 } 36 37 int main() { 38 Values prev_values = get_previous_values(); 39 40 FILE *f; 41 f = fopen("/proc/stat", "r"); 42 char buf[100] = {0}; 43 fgets(buf, 100, f); 44 //printf("%s\n", buf); 45 fclose(f); 46 47 int user, nice, system, idle, iowait, irq, softirq, steal; 48 49 sscanf(buf, "%*s %d %d %d %d %d %d %d %d %*d %*d", &user, &nice, &system, &idle, &iowait, &irq, &softirq, &steal); 50 51 //printf("Current: %d %d %d %d %d %d %d %d\n", user, nice, system, idle, iowait, irq, softirq, steal); 52 //printf("Old: %d %d\n", prev_values.total, prev_values.idle); 53 54 int total = user + nice + system + idle + iowait + irq + softirq + steal; 55 int total_since_last = total - prev_values.total; 56 int idle_since_last = idle - prev_values.idle; 57 58 double fraction = (double)idle_since_last/(double)total_since_last; 59 double usage = 1 - fraction; 60 double percentage = usage * 100; 61 62 //printf("%f %f %f\n", fraction, usage, percentage); 63 if (percentage < 9.995) { 64 printf("%0.2f%%\n", percentage); 65 } else { 66 printf("%0.1f%%\n", percentage); 67 } 68 69 prev_values.total = total; 70 prev_values.idle = idle; 71 72 save_new_values(prev_values); 73 }