linux c 实现 获取系统内存,某进程cpu利用率,以及某端口的网络状况
2017-08-15 10:03
561 查看
linux下有top memwatch netstat 等命令去获取系统的cpu使用率,内存以及对应端口的网络状况。这些信息在显示的时候打印的信息太多,下面就是自定义显示这些信息的一个简单demo。用c语言实现的,其主要的过程基本就是 读取对应的文件,然后从文件中查找对应的信息,然后按照自己定义的格式进行重组显示信息。
此代码不做多余的介绍咯,如果要同时获取多个进程的cpu利用率可以多次调用getProcessCpuRate函数同时也可以自己改写此函数,如果多次调用会造成多次创建读取文件,影响运行速度,建议自己按照需求改写。在编写此demo的时候也参考了网友的博客,此处就不再一一列举,
此代码不做多余的介绍咯,如果要同时获取多个进程的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 512 typedef 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++; bre 9b53 ak;} } } 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); } #endif int main() { #if 1 while(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; }
相关文章推荐
- 关于如何获取一个进程占用的所有网络端口的实现设想
- C++里面有没有获取单个进程的CPU利用率和内存利用率的函数啊?
- Python获取CPU、内存使用率以及网络使用状态代码
- Linux C++ 获取某一进程的CPU占用率以及内存占用情况
- Android获取应用信息判断网络连接返回桌面及卸载apk结束进程等的实现思路
- .NET(C#):获取进程的CPU使用状况
- 获取瞬间的cpu及mem利用率最高的10个进程
- Python语言实现获取主机名根据端口杀死进程
- 第一篇博客 简单调研了一下百度语音 以及简单实现一些根据语音获取网络连接
- 列出Linux网络端口以及进程的所有信息
- C#网络编程笔记:获取主机的内网/公网IP以及主机的随机可用端口
- 获取CPU利用率 系统内存和进程内存
- C++里面有没有获取单个进程的CPU利用率和内存利用率的函数啊?
- linux C获取进程的CPU和内存
- 简单实现SNMP获取系统信息以及网络接口信息
- python自动化运维学习------使用模块psutil获取系统cpu、内存、磁盘、网络、进程等信息
- Python语言实现获取主机名根据端口杀死进程
- Java实现获取cpu、内存、硬盘、网络等信息的方法示例
- linux下如何获取cpu的利用率,内存使用率,网络吞吐率
- Python语言实现获取主机名根据端口杀死进程