一、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文件系统是一个虚拟文件系统,我们将通过对虚拟文件的读写作为与内核实体进行通信的一种手段。该文件的内容是动态创建的,由于,存放的数据都保存在内存中,本身不占用磁盘空间,因此,叫虚拟文件系统。