代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define MAXBUFSIZE 1024
#define WAIT_SECOND 3 //暂停时间,单位为“秒”
typedef struct occupy
{
char name[20];
unsigned int user;
unsigned int nice;
unsigned int system;
unsigned int idle;
} CPU_OCCUPY;
typedef struct PACKED
{
char name[20];
long total;
char name2[20];
long free;
}MEM_OCCUPY;
float g_cpu_used;
int cpu_num; //定义一个全局的int类型cup_num
void cal_occupy(CPU_OCCUPY *, CPU_OCCUPY *);
void get_occupy(CPU_OCCUPY *);
void get_mem_occupy(MEM_OCCUPY *);
float get_io_occupy();
void get_disk_occupy(char ** reused);
void getCurrentDownloadRates(long int * save_rate);
int main()
{
CPU_OCCUPY ocpu, ncpu;
MEM_OCCUPY mem;
//获取cpu核数
cpu_num = sysconf(_SC_NPROCESSORS_ONLN);
printf("cpu mum:%d\n", cpu_num);
//获取cpu使用率
get_occupy(&ocpu);
sleep(1);
get_occupy(&ncpu);
cal_occupy(&ocpu, &ncpu);
printf("cpu used:%4.2f \n", g_cpu_used);
//获取内存使用率
get_mem_occupy(&mem);
double using = ((double)(mem.total - mem.free) / mem.total) * 100;
printf("mem used:%4.2f\n", using);
//获取io使用率
printf("io used:%4.2f\n", get_io_occupy());
//获取当前磁盘的使用率
char t[20] = "";
char *used = t;
get_disk_occupy(&used);
//char used[20]=" " ;
//get_disk_occupy((char **)&used);
printf("disk used:%s\n", used);
//网络延迟
long int start_download_rates; //保存开始时的流量计数
long int end_download_rates; //保存结果时的流量计数
getCurrentDownloadRates(&start_download_rates); //获取当前流量,并保存在start_download_rates里
sleep(WAIT_SECOND); //休眠多少秒,这个值根据宏定义中的WAIT_SECOND的值来确定
getCurrentDownloadRates(&end_download_rates); //获取当前流量,并保存在end_download_rates里
printf("download is : %4.2f byte/s \n", ((float)(end_download_rates - start_download_rates)) / WAIT_SECOND );
}
void cal_occupy (CPU_OCCUPY *o, CPU_OCCUPY *n)
{
double od, nd;
double id, sd;
double scale;
od = (double) (o->user + o->nice + o->system + o->idle); //第一次(用户+优先级+系统+空闲)的时间再赋给od
nd = (double) (n->user + n->nice + n->system + n->idle); //第二次(用户+优先级+系统+空闲)的时间再赋给od
scale = 100.0 / (float)(nd - od); //100除强制转换(nd-od)之差为float类型再赋给scale这个变量
id = (double) (n->user - o->user); //用户第一次和第二次的时间之差再赋给id
sd = (double) (n->system - o->system); //系统第一次和第二次的时间之差再赋给sd
g_cpu_used = ((sd + id) * 100.0) / (nd - od); //((用户+系统)乖100)除(第一次和第二次的时间差)再赋给g_cpu_used
}
void get_occupy (CPU_OCCUPY *o)
{
FILE *fd;
int n;
char buff[MAXBUFSIZE];
fd = fopen ("/proc/stat", "r"); //这里只读取stat文件的第一行及cpu总信息,如需获取每核cpu的使用情况,请分析stat文件的接下来几行。
fgets (buff, sizeof(buff), fd);
sscanf (buff, "%s %u %u %u %u", o->name, &o->user, &o->nice, &o->system, &o->idle);
fclose(fd);
}
void get_mem_occupy(MEM_OCCUPY * mem)
{
FILE * fd;
char buff[MAXBUFSIZE];
fd = fopen("/proc/meminfo", "r");
fgets (buff, sizeof(buff), fd);
sscanf (buff, "%s %ld", mem->name, &mem->total);
fgets (buff, sizeof(buff), fd);
sscanf (buff, "%s %ld", mem->name2, &mem->free);
}
float get_io_occupy()
{
char cmd[] = "iostat -d -x";
char buffer[MAXBUFSIZE];
char a[20];
float arr[20];
FILE* pipe = popen(cmd, "r");
if (!pipe)
{
return -1;
}
fgets(buffer, sizeof(buffer), pipe);
fgets(buffer, sizeof(buffer), pipe);
fgets(buffer, sizeof(buffer), pipe);
fgets(buffer, sizeof(buffer), pipe);
sscanf(buffer, "%s %f %f %f %f %f %f %f %f %f %f %f %f %f ", a, &arr[0], &arr[1], &arr[2], &arr[3], &arr[4],
&arr[5], &arr[6], &arr[7], &arr[8], &arr[9], &arr[10], &arr[11], &arr[12]);
//printf("%f\n",arr[12]);
pclose(pipe);
return arr[12];
}
void get_disk_occupy(char ** reused)
{
char currentDirectoryPath[ MAXBUFSIZE ];
getcwd(currentDirectoryPath, MAXBUFSIZE);
//printf("当前目录:%s\n",currentDirectoryPath);
char cmd[50] = "df ";
strcat(cmd, currentDirectoryPath);
//printf("%s\n",cmd);
char buffer[MAXBUFSIZE];
FILE* pipe = popen(cmd, "r");
char fileSys[20];
char blocks[20];
char used[20];
char free[20];
char percent[10];
char moment[20];
if (!pipe)
{
return;
}
if (fgets(buffer, sizeof(buffer), pipe) != NULL)
{
sscanf(buffer, "%s %s %s %s %s %s", fileSys, blocks, used, free, percent, moment);
}
if (fgets(buffer, sizeof(buffer), pipe) != NULL)
{
sscanf(buffer, "%s %s %s %s %s %s", fileSys, blocks, used, free, percent, moment);
}
//printf("desk used:%s\n",percent);
strcpy(*reused, percent);
return;
}
void getCurrentDownloadRates(long int * save_rate)
{
char intface[] = "eth0:"; //这是网络接口名,根据主机配置
//char intface[] = "wlan0:";
FILE * net_dev_file;
char buffer[1024];
size_t bytes_read;
char * match;
if ((net_dev_file = fopen("/proc/net/dev", "r")) == NULL)
{
printf("open file /proc/net/dev/ error!\n");
exit(EXIT_FAILURE);
}
int i = 0;
while (i++ < 20)
{
if (fgets(buffer, sizeof(buffer), net_dev_file) != NULL)
{
if (strstr(buffer, intface) != NULL)
{
//printf("%d %s\n",i,buffer);
sscanf(buffer, "%s %ld", buffer, save_rate);
break;
}
}
}
if (i == 20)
{
*save_rate = 0.01;
}
fclose(net_dev_file); //关闭文件
return;
}
打印结果:
cpu mum:4
cpu used:1.25
mem used:70.30
io used:0.10
disk used:4%
download is : 4963.33 byte/s