用C++和shell获取本机CPU、网卡、内存、磁盘等的基本信息;

由于对C++相关的函数没多少了解,但是觉得用shell反而相对简单一些:

一、shell脚本,用来辅助C++获取主机的资源使用信息

(1) cpurate.sh 获取cpu的使用率

#!/bin/sh

##echo user nice system idle iowait irq softirq
CPULOG_1=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
SYS_IDLE_1=$(echo $CPULOG_1 | awk '{print $4}')
Total_1=$(echo $CPULOG_1 | awk '{print $1+$2+$3+$4+$5+$6+$7}') sleep CPULOG_2=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
SYS_IDLE_2=$(echo $CPULOG_2 | awk '{print $4}')
Total_2=$(echo $CPULOG_2 | awk '{print $1+$2+$3+$4+$5+$6+$7}') SYS_IDLE=`expr $SYS_IDLE_2 - $SYS_IDLE_1` Total=`expr $Total_2 - $Total_1`
SYS_USAGE=`expr $SYS_IDLE/$Total* |bc -l` SYS_Rate=`expr -$SYS_USAGE |bc -l` Disp_SYS_Rate=`expr "scale=3; a=$SYS_Rate/1; if(length(a)==scale(a) && a!=0) print 0;print a" |bc`
echo $Disp_SYS_Rate%

(2)memrate.sh 获取内存的使用率

#!/bin/sh

MemTotal=$(cat /proc/meminfo | grep 'MemTotal' | awk '{print $2}')
MemFree=$(cat /proc/meminfo | grep 'MemFree' | awk '{print $2}') Disp_SYS_Rate=`expr "scale=3; a=100*$MemFree/$MemTotal; if(length(a)==scale(a)) print 0;print a" |bc`
echo $Disp_SYS_Rate%

(3)network.sh 获取网卡的使用率

#!/bin/sh

cat /proc/net/dev | grep 'eth' | awk '{ if($2!=0) print $1"/"$2}'

(4)getsize.sh 获取磁盘的可用与总共的大小

#!/bin/bash

LISTEN_PATH=./
if [ -n $ ]; then
LISTEN_PATH=$
fi
echo `df -h $LISTEN_PATH | grep "dev" `| awk '{print $3"/"$2}'

二、C++ file用来调用上面的shell文件获取信息

#include<iostream>
#include<string>
#include <stdio.h> using namespace std; bool GetCpuRate(std::string& cpurate)
{
FILE *file;
string cmd("./cpurate.sh"); file = popen(cmd.c_str(), "r");
if(file == NULL)
{
cout<<cmd<<" fail"<<endl;
return false;
}
char buf[] = {}; while(fgets(buf, sizeof(buf), file) != NULL)
{
char tmpbuf[]={};
sscanf(buf,"%s",tmpbuf);
cpurate=std::string(tmpbuf);
}
pclose(file);
return true;
}
bool GetMemRate(std::string& memrate)
{
FILE *file;
string cmd("./memrate.sh"); file = popen(cmd.c_str(), "r");
if(file == NULL)
{
cout<<cmd<<" fail"<<endl;
return false;
}
char buf[] = {}; while(fgets(buf, sizeof(buf), file) != NULL)
{
char tmpbuf[]={};
sscanf(buf,"%s",tmpbuf);
memrate=std::string(tmpbuf);
}
pclose(file);
return true;
} bool GetNetInfo(std::string& network)
{
FILE *file;
string cmd("./network.sh"); file = popen(cmd.c_str(), "r");
if(file == NULL)
{
cout<<cmd<<" fail"<<endl;
return false;
}
char buf[] = {}; while(fgets(buf, sizeof(buf), file) != NULL)
{
char tmpbuf[]={};
sscanf(buf,"%s",tmpbuf);
network=std::string(tmpbuf);
}
pclose(file);
return true;
} bool GetDiskInfo(std::string& diskInfo,const std::string path)
{
FILE *file;
string cmd("./getsize.sh "+path); file = popen(cmd.c_str(), "r");
if(file == NULL)
{
cout<<cmd<<" fail"<<endl;
return false;
}
char buf[] = {}; while(fgets(buf, sizeof(buf), file) != NULL)
{
char tmpbuf[]={};
sscanf(buf,"%s",tmpbuf);
diskInfo=std::string(tmpbuf);
}
pclose(file);
return true;
} int main()
{
std::string cpurate, memrate, network, diskInfo;
GetCpuRate(cpurate);
GetMemRate(memrate);
GetNetInfo(network);
GetDiskInfo(diskInfo, "/home/");
cout<<cpurate<<endl;
cout<<memrate<<endl;
cout<<network<<endl;
cout<<diskInfo<<endl;
return ;
}

三、获取当前活动的网卡和mac,C++file(这两个是抄别人的,但是时间有点久,找不到是谁的了)

(1) getethaddr.c 获取当前的网卡地址

#include <stdio.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h> int get_local_ip(char *ip_list) {
struct ifaddrs *ifAddrStruct;
void *tmpAddrPtr;
char ip[INET_ADDRSTRLEN];
int n = ;
getifaddrs(&ifAddrStruct);
while (ifAddrStruct != NULL) {
if (ifAddrStruct->ifa_addr->sa_family==AF_INET) {
tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
inet_ntop(AF_INET, tmpAddrPtr, ip, INET_ADDRSTRLEN);
if (strcmp(ip, "127.0.0.1") != ) {
// printf("%s IP Address:%s\n", ifAddrStruct->ifa_name, ip);
if (n == ){
memcpy(ip_list, ip, INET_ADDRSTRLEN);
} else {
memcpy(ip_list+INET_ADDRSTRLEN, ip, INET_ADDRSTRLEN);
}
n++;
}
}
ifAddrStruct=ifAddrStruct->ifa_next;
}
//free ifaddrs
freeifaddrs(ifAddrStruct);
return n;
}
int main()
{
char ip[][INET_ADDRSTRLEN];
memset(ip, , sizeof(ip));
int n;
for (n=get_local_ip(*ip); n>; n--) {
printf("%s\n", ip[n-]);
}
return ;
}

(2) 获取mac地址getmac.c

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> #include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <linux/if.h> #define IFNAMSIZ 16 char ifname_buf[];
char *ifnames = ifname_buf;
int count = ; void add_interface_name(const char * name)
{
int i;
for (i=;i<count;i++)
{
if (!strcmp(ifnames+i*IFNAMSIZ, name))
return;
}
strncpy(ifnames+(count++)*IFNAMSIZ, name, IFNAMSIZ-);
} char * get_name(char *name, char *p)
{
while (isspace(*p))
p++;
while (*p) {
if (isspace(*p))
break;
if (*p == ':') { /* could be an alias */
char *dot = p, *dotname = name;
*name++ = *p++;
while (isdigit(*p))
*name++ = *p++;
if (*p != ':') { /* it wasn't, backup */
p = dot;
name = dotname;
}
if (*p == '\0')
return NULL;
p++;
break;
}
*name++ = *p++;
}
*name++ = '\0';
return p;
} // get /proc/net/dev interface name list into buffer
// return 0 if success
int get_procnet_list()
{
FILE *fh;
char buf[];
fh = fopen("/proc/net/dev", "r");
if (!fh)
return -; fgets(buf, sizeof buf, fh); /* eat title lines */
fgets(buf, sizeof buf, fh);
while (fgets(buf, sizeof buf, fh))
{
char name[IFNAMSIZ];
get_name(name, buf);
add_interface_name(name);
}
fclose(fh);
return ;
} long mac_addr_sys ( u_char *addr)
{
/* implementation for Linux */
struct ifreq ifr;
struct ifreq *IFR;
struct ifconf ifc;
char buf[];
int s, i;
int ok = ; // clear buffer
memset(ifname_buf, , sizeof(ifname_buf)); s = socket(AF_INET, SOCK_DGRAM, );
if (s==-) {
return -;
} ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
ioctl(s, SIOCGIFCONF, &ifc); IFR = ifc.ifc_req;
// put the ioctl interface names in the list
for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= ; IFR++) {
add_interface_name(IFR->ifr_name);
}
// put the /proc/net/dev interface names in the list
if (get_procnet_list())
return -; // get the first mac address of eth* device hardware address
for (i = ; i < count; i++) {
strcpy(ifr.ifr_name, ifnames + i*IFNAMSIZ);
if (!strncmp(ifr.ifr_name, "eth", ))
if (ioctl(s, SIOCGIFFLAGS, &ifr) == ) {
if (! (ifr.ifr_flags & IFF_LOOPBACK)) {
if (ioctl(s, SIOCGIFHWADDR, &ifr) == ) {
char *p = (char *)ifr.ifr_hwaddr.sa_data;
if (!*((int *)p) && !*((int *)(p+)) )
continue;
// if not 00:00:00:00:00:00, yes, we get the real mac addr
ok = ;
break;
}
}
}
} close(s);
if (ok) {
bcopy( ifr.ifr_hwaddr.sa_data, addr, );
}
else {
return -;
}
return ;
} int main( int argc, char **argv)
{
long stat;
int i;
u_char addr[]; stat = mac_addr_sys( addr);
if ( == stat) {
printf( "MAC address = ");
for (i=; i<; ++i) {
printf("%2.2x", addr[i]);
if (i<)
printf(":");
}
printf( "\n");
}
else {
fprintf( stderr, "can't get MAC address\n");
exit( );
}
return ;
}

用C++和shell获取本机CPU、网卡IO、内存、磁盘等的基本信息的更多相关文章

  1. 用 shell 获取本机的网卡名称

    用 shell 获取本机的网卡名称 # 用 shell 获取本机的网卡名称 ls /sys/class/net # 或者 ifconfig | grep "Link" | awk ...

  2. Golang利用第三方包获取本机cpu使用率以及内存使用情况

    第三方包下载 $ github.com/shirou/gopsutil 获取内存方面的信息 package main import ( "fmt" "github.com ...

  3. 获取本机CPU,硬盘等使用情况

    早上的时候接到主管的一个任务,要获取服务器上的cpu,硬盘, 数据库等 的使用情况,并以邮件的方式发给boss, = =没办法,公司的服务器真是不敢恭维,顺便吐槽一下公司的网速,卡的时候30k左右徘徊 ...

  4. 编程获取linux的CPU使用的内存使用情况

    Linux可用下top.ps命令检查当前的cpu.mem用法.下面简单的例子: 一.采用ps查看资源消耗的过程 ps -aux 当您查看进程信息,第三列是CPU入住. [root@localhost ...

  5. [No0000112]ComputerInfo,C#获取计算机信息(cpu使用率,内存占用率,硬盘,网络信息)

    github地址:https://github.com/charygao/SmsComputerMonitor 软件用于实时监控当前系统资源等情况,并调用接口,当资源被超额占用时,发送警报到个人手机: ...

  6. 基于WMI获取本机真实网卡物理地址和IP地址

    using System; using System.Collections.Generic; using System.Management; using System.Runtime.Intero ...

  7. C# 获取本机CPU序列号,MAC地址,硬盘ID,本机IP地址,计算机名,物理内存,PC类型

    首先引入服务 然后 调用 本文转载自http://blog.sina.com.cn/s/blog_7eeb43210101hf7f.html public class Computer { publi ...

  8. 获取Windows操作系统的CPU使用率以及内存使用率

    此功能参考了ProcessHacker项目的代码. 声明定义 typedef struct _UINT64_DELTA { ULONG64 Value; ULONG64 Delta; } UINT64 ...

  9. Linux C 获取本机所有网卡的 IP,Mask

    0 运行环境 本机系统:Windows 10 虚拟机软件:Oracle VM VirtualBox 6 虚拟机系统:Ubuntu 18 1 代码 #include <sys/ioctl.h> ...

随机推荐

  1. MS SQL Server2014链接MS SQL Server 2000

    开发与企业应用中,好几个版本SQL Server相互链接.分布式读取与存储,需要实现sp_addlinkedserver.SQL Server 2000, SQL Server 2008, SQL S ...

  2. MYSQL数据回流

         一般的网站应用中,总会有部分二次数据(处理过的原始数据)展现给前台,比如,拿购物网站来说,购买进口奶粉最多的用户群体:哪类产品消费增长趋势最旺盛:用户的消费历史归类等都是二次数据.由于这部分 ...

  3. CPU卡与M1卡的区别

    简单来讲CPU卡比M1卡更加安全.扩展性更好.支持更多应用   CPU卡 M1 操作系统 带有COS系统 无COS系统 硬件加密模块 硬件DES运算模块 无实现算法的硬件加密模块 算法支持 标准DES ...

  4. LNMP+zabbix分布式监控搭建及版本升级

    LNMP+zabbix分布式监控搭建需要组件:gcc gcc-c++ openssl* pcre pcre-devel gd gd-devel libjpeg-devel libpng-devel l ...

  5. Linux 下从头再走 GTK+-3.0 (一)

    原本由于项目需求在 Linux 下学习过一段时间的 GTK+2.0 图形开发,时隔一段时间,想真正深入学习一下 GTK . 这次直接从头学习 GTK+-3.0 ,并写下博文便于日后查看,也方便新手入门 ...

  6. [转]12篇学通C#网络编程——第二篇 HTTP应用编程(上)

    本文转自:http://www.cnblogs.com/huangxincheng/archive/2012/01/09/2316745.html 我们学习网络编程最熟悉的莫过于Http,好,我们就从 ...

  7. 【原】webapp开发中兼容Android4.0以下版本的css hack

    话说现在的手机型号越来越多,主要还是android和ios这2个巨头称霸了江湖,而他们自带的浏览器内核是webkit,那对于做移动网页开发的同事来说,一般只要做好webkit内核浏览器的展现效果就行了 ...

  8. 父元素与子元素之间的margin-top问题

    父元素的盒子包含一个子元素盒子,给子元素盒子一个垂直外边距margin-top,父元素盒子也会往下走margin-top的值,而子元素和父元素的边距则没有发生变化. html代码: <div c ...

  9. [No000046]为什么跳槽加薪会比内部调薪要高?

    有网友在知乎提问: 最近在思考一个问题,为什么跳槽往往意味着加薪? 如果一个人确有价值,为什么在原来的公司没有在薪水上体现出来?如果没有价值,为什么跳槽以后就会加薪?还是可以单纯的解释为,应聘者和招聘 ...

  10. jq分页异步刷新 ,全局刷新问题

    在做分页的时候,可能点击下一页全部刷新 这样写会导致动态刷新,页面全部刷新了 $("#pageList a").click(function () { var $s = $(thi ...