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

       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;
}


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值