工作记录1-获取linux系统相关信息

一、linux系统获取设备信息的方式主要有以下几种:

1)通过执行shell命令(最多)。

本项目主要通过popen()函数建立管道I/O,利用文件流(FILE)对返回的内容进行接收,然后,利用fgets()函数从文件流中读取字符内容,并进行处理。具体形式如下:

功能:获取操作系统版本
string GetOSVer()
{
	 FILE *fp=NULL;
	 char buf[100];
	 string OsVerson;  						//存放系统版本信息
	 fp=popen("uname -r","r");    //shell指令

	 if(!fp)          		    //①指针为NULL,安全退出,防止程序崩溃
	  {
		 cout<<"failed to popen GetOSVer!"<<endl;
		 return "";               
	  }
	 while(memset(buf,0,sizeof(buf)),fgets(buf,sizeof(buf)-1,fp)!=0)
	 {
		 OsVerson=buf;
	 }
   pclose(fp);                 //②popen()函数的返回值是一个标准I/O流,必//须用pclose()函数进行关闭
   return OsVerson;
}

注意:①当指针为NULL时,如果没有使程序正常退出时,当情况发生时,软件则会崩掉。

2)通过读取系统文件,进行编程计算得到的。如CPU利用率、网路流量、内存利用率。**

本项目主要通过fopen()函数打开指定文件,利用文件流(FILE)对返回的内容进行接收,然后,利用fgets()函数从文件流中读取字符内容,并进行处理。具体形式如下:

功能:获取操作系统名称
string GetOSName()
{
		FILE *fp = fopen("/etc/redhat-release","r");   //cat /etc/redhat-release
		if (NULL==fp)
		{
			cout << "failed to open GetOSName!" << endl;
			return "";
		}
		char szTest[1000] = {0};
		memset(szTest,0,sizeof(szTest));
		fgets(szTest,sizeof(szTest)-1,fp);  //leave out
		string OsName=szTest;
		fclose(fp);
		return OsName;
}

注意情况,与shell方式一样。
3)通过调用一些linux网络编程接口,进行编程获取的。

如获取IP用到的<arpa/inet.h>、<netdb.h>等头文件提供的inet_ntop()、freeifaddrs()等接口。

功能:获取设备IP
string GetIPInfo()
{
	char host_name[256] = {0};
	gethostname(host_name,sizeof(host_name));
	string IpStr;    //接收IP信息
	struct hostent * host = gethostbyname(host_name);
	char ip_str[32] = {0};
	const char* ret = inet_ntop(host->h_addrtype,host->h_addr_list[0],ip_str,sizeof(ip_str));
	if (ret==NULL)
	{
		return "";
	}
	IpStr=ip_str;     //设备IP

	struct ifaddrs *ifAddrStruct = NULL;
	struct ifaddrs *ifa = NULL;

	getifaddrs(&ifAddrStruct);

	for (ifa = ifAddrStruct; ifa != NULL;ifa=ifa->ifa_next)
	{
		if (!ifa->ifa_addr)
			continue;

		if (ifa->ifa_addr->sa_family == AF_INET)
		{
			void *tmpAddrPtr = &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
			char local_ip[INET_ADDRSTRLEN];
			inet_ntop(AF_INET,tmpAddrPtr,local_ip,INET_ADDRSTRLEN);
		}
	}
	if (ifAddrStruct)
	{
		freeifaddrs(ifAddrStruct);
	}
	return IpStr;
}

二、拓展
1. CPU利用率计算方式?

CPU利用率就是服务器(或机器)在某一时间点CPU使用情况占总CPU的比例。CPU利用率越高,则
Linux系统中,CPU时间的分配信息保存在/proc/stat文件中,利用率计算的参数从该文件中获取。

不同Linux版本对应/proc/stat文件中的内容也不一样,这里以Centos 7.0版本来说,/proc/stat文件内各数据的含义:
cpu  197108 41 65889 34879524 2036 0 2774 0 0 0
cpu0 98243 10 28557 17470507 162 0 850 0 0 0
cpu1 98865 31 37331 17409016 1873 0 1923 0 0 0
其中,以第一行为例:
各时间都表示从系统启动开始到累计到当前时刻的总时间。
1.	user(197108):用户态的CPU时间,不包含nice值为负的进程。单位:jiffies,1 jiffies=0.01秒。
2.	nice(41): nice值为负的进程所占用的CPU时间。
3.	system(65889):核心时间(核心态)。
4.	idle(34879524):除硬盘IO等待时间以外其它等待时间(空闲态)。
5.	iowait(2036):磁盘IO等待时间。
6.	irq(0):硬中断时间。
7.	softirq(2774):软中断时间。
思想:采样思想。在两个时刻分别读取/proc/stat配置文件,获取CPU时间的分配时间,然后利用CPU利用率公式,计算CPU利用率。
方法一:
CPUTotal= user+ nice+ system+ idle+ iowait+ irq+ softirq;
CPURate=( idle2- idle1)/(CPUTotal2- CPUTotal1)*100;
CPURate=(1-( idle2- idle1)/(CPUTotal2- CPUTotal1))*100;
方法二:
Total= user+ nice+ system+ idle+ iowait+ irq+ softirq;
CPURate=((Totle2-Totle1)-(idle2-idle1))/( Total2- Total1)*100

2. 网络流量计算方法?

Linux系统中,内存使用的相关分配信息保存在/proc/net/dev文件中,网络流量计算的参数从该文件中获取。

方法:
Receive 表示收包,Transmit表示发包
Bytes表示收发的字节数
Packets表示收发正确的包量
Errs表示收发错误的包量
Drop表示收发丢弃的包量
在两个时刻分别读取/proc/net/dev文件,获取当前时刻的网络流量,然后利用两时刻接收数据之差除以时间间隔,获取此时段内的网速。

3. 内存利用率计算方法?

Linux系统中,内存使用的相关分配信息保存在/proc/meminfo文件中,利用率计算的参数从该文件中获取。

MemTotal:        3865308 kB       
所有可用RAM大小(即物理内存减去一些预留位和内核的二进制代码大小)
MemFree:         1094360 kB
系统未使用的内存(LowFree与HignFree的总和)
MemAvailable:    1918500 kB
应用程序可用内存。系统中有些内存虽然已被使用但是可以回收,比如cache/buffer、slab都有一部分可以回收,所以,MemFree不能代表全部可用内存,这部分可回收的内存加上MemFree才是系统可用的内存。MemAvailable= MemFree+ Buffers+ Cached.
Buffers:            2116 kB
Cached:          1002064 kB
缓存,是为了弥补高速设备和低俗设备的鸿沟而引入的中间层,最终起到加快取速度的作用。举例来说,每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事上。用buffers暂存起来,变成每10秒写入一次硬盘,对系统的冲击就很小,写入效率高了。

内存利用率公式:
1.	MemUsedRate=(( MemTotal-MemAvailable)/MemTotal)*100;
2.	MemUsedRate=(( MemTotal- MemFree)/MemTotal)*100;
4.	存放设备信息的常用文件?
/proc文件系统是一个虚拟文件系统,我们将通过对虚拟文件的读写作为与内核实体进行通信的一种手段。该文件的内容是动态创建的,由于,存放的数据都保存在内存中,本身不占用磁盘空间,因此,叫虚拟文件系统。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值