您的位置:首页 > 理论基础 > 计算机网络

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

2017-08-15 10:03 561 查看
       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++;
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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: