cpu使用率和内存使用率
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <fcntl.h> #include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/time.h>static char buffer[1024]; static char cpu_name[10]; typedef struct {long cpu_user;long cpu_nice;long cpu_sys;long cpu_idle; long cpu_iowait;long cpu_irq;long cpu_softirq; long cpu_all;}CPU_STAT_S;static CPU_STAT_S old;char *get_cpu_name(char *data, char *name){ while(!(*data == ' ' ||*data == '\0')) { *name++ = *data++; } *name++ = '\0'; return data;}//读取/proc/stat文件内容CPU_STAT_S get_cpu_data(void){ int fp = 0; int len = 0; char *p; CPU_STAT_S cpu_stat; fp = open("/proc/stat", O_RDONLY); len = read(fp, buffer,sizeof(buffer)-1); close(fp); buffer[len] = '\0'; memset(&cpu_stat, 0, sizeof(CPU_STAT_S)); p = get_cpu_name(buffer, cpu_name); cpu_stat.cpu_user = strtoul(p, &p, 0); cpu_stat.cpu_nice = strtoul(p, &p, 0); cpu_stat.cpu_sys = strtoul(p, &p, 0); cpu_stat.cpu_idle = strtoul(p, &p, 0); cpu_stat.cpu_iowait = strtoul(p, &p, 0); cpu_stat.cpu_irq = strtoul(p, &p, 0); cpu_stat.cpu_softirq = strtoul(p, &p, 0); cpu_stat.cpu_all = cpu_stat.cpu_user + cpu_stat.cpu_nice + cpu_stat.cpu_sys \ + cpu_stat.cpu_idle + cpu_stat.cpu_iowait + cpu_stat.cpu_irq \ + cpu_stat.cpu_softirq; return cpu_stat;}//计算CPU使用率float get_cpu_stat(void){ float usage = 0.0; float child_usage = 0.0; float father_usage = 0.0; CPU_STAT_S cur; memset(&cur, 0, sizeof(CPU_STAT_S)); cur= get_cpu_data(); child_usage=(cur.cpu_idle - old.cpu_idle); father_usage=(cur.cpu_all-old.cpu_all); usage = 100-child_usage/father_usage*100; old=cur; return usage;}///////////////////////////////////////////////////////////////////////typedef struct meminfo meminfo;struct meminfo{ long total; long free; long buffers; long cached;};//先读取/proc/meminfo文件,然后计算内存使用率float get_mem_stat(){ FILE *fp = 0; char buf[100]; char str[100]; float free; float total; float usage = 0.0; meminfo mem; double lv; if ((fp = fopen ("/proc/meminfo", "r")) == NULL) { printf("File open error!\n"); exit (1); } long data; fgets(buf,100,fp); sscanf(buf,"%*s%ld",&mem.total); fgets(buf,100,fp); sscanf(buf,"%*s%ld",&mem.free); fgets(buf,100,fp); sscanf(buf,"%*s%ld",&mem.buffers); fgets(buf,100,fp); sscanf(buf,"%*s%ld",&mem.cached); fclose(fp); //如果Cached值大于MemTotal值则空闲内存为MemFree值,否则空闲内存为MemFree值+Buffers值+Cached值 total=mem.total; if(mem.cached>mem.total) { free=mem.free; } else { free=mem.free+mem.buffers+mem.cached; } usage=(free)/total*100; return usage;}/////////////////////////////////////////////////////////////////////////1S中打印一次int main(void){ printf("start while! \n"); old= get_cpu_data(); while(1) { usleep(1000*1000); printf("cpu:%.2f , mem:%.2f\n",get_cpu_stat(),get_mem_stat()); } return 0;}??