CPU使用率取得
なんかCPU使用率取得を知りたいらしく検索してくるらしい。
Kernel2.6で試しに作ってみた。
ヒントは/proc/statのCPUの行。
この内容の意味はman procに書いてある。
#include <unistd.h> typedef struct{ long user; long nice; long system; long idel; long iowait; long irq; long softirq; }cpu_t; int get_cpu(cpu_t *cpu){ char str[BUFSIZ]; FILE *fp; fp = fopen("/proc/stat", "r"); if(fp == NULL){ return -1; } fgets(str, sizeof(str), fp); sscanf(str, "cpu %ld %ld %ld %ld %ld %ld %ld", &cpu->user, &cpu->nice, &cpu->system, &cpu->idel, &cpu->iowait, &cpu->irq, &cpu->softirq); fclose(fp); return 0; } long cpu_all_time(cpu_t *new, cpu_t *old){ long ret; ret = (new->user - old->user) + (new->nice - old->nice) + (new->system - old->system) + (new->idel - old->idel) + (new->irq - old->irq) + (new->softirq - old->softirq); return ret; } long cpu_used_time(cpu_t *new, cpu_t *old){ long ret; ret = (new->user - old->user) + (new->nice - old->nice) + (new->system - old->system) + (new->iowait - old->iowait) + (new->irq - old->irq) + (new->softirq - old->softirq); return ret; } double cpu_rate(cpu_t *new, cpu_t *old){ long all, used; double rate; all = cpu_all_time(new, old); used = cpu_used_time(new, old); rate = (double)used/all*100; if(rate > 100){ rate = 100; } return rate; } int main(void){ int ret; unsigned int sleep_time = 1; double rate; cpu_t old, new; ret = get_cpu(&old); if(ret < 0){ return 1; } while(1){ sleep(sleep_time); ret = get_cpu(&new); if(ret < 0){ return 1; } rate = cpu_rate(&new, &old); printf("cpu rate:%.1f%%\n", rate); old = new; } return 0; }