1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > linux c 获取 CPU 内存 IO 磁盘 网速

linux c 获取 CPU 内存 IO 磁盘 网速

时间:2021-11-25 08:35:57

相关推荐

linux c 获取 CPU 内存 IO 磁盘 网速

代码:

#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_numvoid 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); //第一次(用户+优先级+系统+空闲)的时间再赋给odnd = (double) (n->user + n->nice + n->system + n->idle); //第二次(用户+优先级+系统+空闲)的时间再赋给odscale = 100.0 / (float)(nd - od); //100除强制转换(nd-od)之差为float类型再赋给scale这个变量id = (double) (n->user - o->user); //用户第一次和第二次的时间之差再赋给idsd = (double) (n->system - o->system); //系统第一次和第二次的时间之差再赋给sdg_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:4cpu used:1.25 mem used:70.30io used:0.10disk used:4%download is : 4963.33 byte/s

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。