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 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++;
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);
}
#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;
}