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;
}