linux c 实现 获取系统内存,某进程cpu利用率,以及某端口的网络状况

来源:互联网 发布:程序员职业规划之道pdf 编辑:程序博客网 时间:2024/05/17 08:26

       linux下有top memwatch  netstat 等命令去获取系统的cpu使用率,内存以及对应端口的网络状况。这些信息在显示的时候打印的信息太多,下面就是自定义显示这些信息的一个简单demo。用c语言实现的,其主要的过程基本就是 读取对应的文件,然后从文件中查找对应的信息,然后按照自己定义的格式进行重组显示信息。

此代码不做多余的介绍咯,如果要同时获取多个进程的cpu利用率可以多次调用getProcessCpuRate函数同时也可以自己改写此函数,如果多次调用会造成多次创建读取文件,影响运行速度,建议自己按照需求改写。在编写此demo的时候也参考了网友的博客,此处就不再一一列举,


#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <errno.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <fcntl.h>#include <sys/socket.h>#include <net/if.h>#include <net/route.h>#include <netinet/in.h>#include <arpa/inet.h>#include <time.h>#include <string.h>#if 1//get the system net state#define TCP_FILE "/proc/net/tcp"#define  P_TCP  "tcp"//get the system laod average#define LOAD_FILE "/proc/loadavg"//get the process cpu rate#define PID_CPURATE "/home/buffer/pid.txt"#define CPURATE_HEADER_ARM "  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND\n"#define CPURATE_HEADER_PC "  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND\n"#define INFO_LENGTH_128 128#define INFO_LENGTH_256 256#define INFO_LENGTH_512 512typedef struct netstat{int Port;int closewaitnum;int timewaitnum;} Netstat;typedef struct sysLoad{unsigned int load_avg1;unsigned int load_avg5;unsigned int load_avg15;} sysLoad;typedef union iaddr iaddr;union iaddr {      unsigned u;      unsigned char b[4];  }; void sysLoadavg(char *filename){sysLoad sysload;char buf[INFO_LENGTH_128];  int load_tmp[3];    memset(buf,0,INFO_LENGTH_128);memset(&sysload,0,sizeof(struct sysLoad));FILE *fp = fopen(filename, "r");      if (fp == NULL) {  printf("open %s  error \n ",filename);        return;      }if(fscanf(fp,"%d.%d %d.%d %d.%d \n",&load_tmp[0],&sysload.load_avg1,&load_tmp[1],&sysload.load_avg5,&load_tmp[2],&sysload.load_avg15) != 6){fclose(fp);}sysload.load_avg1 += load_tmp[0]*100;sysload.load_avg5 += load_tmp[1]*100;sysload.load_avg15 += load_tmp[2]*100;double n1 = sysload.load_avg1;double n2 = sysload.load_avg5;double n3 = sysload.load_avg15;int pos = sprintf(buf,"%1.2f, %1.2f %1.2f",n1/100,n2/100,n3/100);buf[pos] = '\0';printf("loadavg:%s\n\n",buf);fclose(fp);}void dispNetstat(Netstat net){fprintf(stderr,"%d\t\t %d\t\t %d\t\n",net.Port,net.closewaitnum,net.timewaitnum);}void ipv4(char *filename,  char *label) {  Netstat Port_80;Netstat Port_554;Netstat Port_9822;Netstat Port_9824;Port_80.Port = 80;Port_80.closewaitnum = 0;Port_80.timewaitnum = 0;Port_554.Port = 554;Port_554.closewaitnum = 0;Port_554.timewaitnum = 0;Port_9822.Port = 9822;Port_9822.closewaitnum = 0;Port_9822.timewaitnum = 0;Port_9824.Port = 9824;Port_9824.closewaitnum = 0;Port_9824.timewaitnum = 0;FILE *fp = fopen(filename, "r");      if (fp == NULL) {          return;      }    char buf[INFO_LENGTH_256];      fgets(buf, INFO_LENGTH_256, fp);      while (fgets(buf, INFO_LENGTH_256, fp)){          char lip[INFO_LENGTH_128];          char rip[INFO_LENGTH_128];          iaddr laddr, raddr;          unsigned lport, rport, state, txq, rxq, num;          int n = sscanf(buf, " %d: %x:%x %x:%x %x %x:%x",                         &num, &laddr.u, &lport, &raddr.u, &rport,                         &state, &txq, &rxq);  switch(lport){case 80:{if(state == 0x8)Port_80.closewaitnum++;else if(state == 0x6)Port_80.timewaitnum++;break;}case 554:{if(state == 0x8)Port_554.closewaitnum++;else if(state == 0x6)Port_554.timewaitnum++;break;}case 9822:{if(state == 0x8)Port_9822.closewaitnum++;else if(state == 0x6)Port_9822.timewaitnum++;break;}case 9824:{if(state == 0x8)Port_9824.closewaitnum++;else if(state == 0x6)Port_9824.timewaitnum++;break;}}}    fclose(fp); fprintf(stderr,"port\t closewaitnum\t timewaitnum\t \n");dispNetstat(Port_80);dispNetstat(Port_554);dispNetstat(Port_9822);dispNetstat(Port_9824);}void getProcessCpuRate(char * process){char buf[INFO_LENGTH_256];char * buf_tmp; system("top -n 1 > /home/buffer/pid.txt");FILE *fp = fopen(PID_CPURATE,"r");if(fp == NULL){fprintf(stderr,"%s open fail\n",PID_CPURATE);}while(!feof(fp)){ memset(buf,0,INFO_LENGTH_256); if(fgets(buf,INFO_LENGTH_256,fp) != NULL) { if((buf_tmp = strstr(buf,process)) != NULL) break; }}fclose(fp);fprintf(stderr,"%s",buf);}#endifint main(){#if 1while(1){sysLoadavg(LOAD_FILE);fprintf(stderr,"%s",CPURATE_HEADER_ARM);getProcessCpuRate("boa.bin -d");printf("\n");ipv4(TCP_FILE, P_TCP);sleep(2);system("clear");//clear the screen pritenln}#endif return 0;}


阅读全文
0 0
原创粉丝点击