LINUX下获取CPU和内存使用率

linuxt提供了系统函数sysconf()用来读取CPU和内存信息,先来了解一下sysconf()函数吧。

头文件

#include<unistd.h>

函数原型

long sysconf (int name);

说明

sysconf() 返回选项 ( 变量) 的当前值,这个值可配置的但也是受系统限制的。在成功完成的情况下,sysconf() 返回 变量的当前值。该值受到的限制将少于编译时 <limits.h>, <unistd.h> 或 <time.h> 中可用的对应值。大多数这些 变量的值在调用进程的生存时间内不变。
如果出错,那么函数返回 -1 ,并适当地设置 errno 。当没有错误发生时, -1 也是一个合法的返回值。因此,程序要检查错误,应该在调用 sysconf() 之前将 errno 设置为 0 ,然后,如果返回 -1,则检验到错误。
参数 name 指定我们感兴趣的运行时限制的名字,它必须是以值中之一(除非另有说明,否则返回值都是整数):
_SC_2_C_BIND  :  一个布尔值,指出是否支持 POSIX C 语言绑定。返回值是 _POSIX2_C_BIND 。
_SC_2_C_DEV  :  一个布尔值,指出是否支持 POSIX C 语言开发使用工具选项。返回值是 _POSIX2_C_DEV 。
_SC_2_C_VERSION :  它指出支持哪一个 ISO POSIX.2 标准 (命令) 的版本。返回值是 _POSIX2_C_VERSION 。
_SC_2_CHAR_TERM :  一个布尔值,指出是否至少支持一个 终端。返回值是 _POSIX2_CHAR_TERM 。
_SC_2_FORT_DEV  :  一个布尔值,指出是否支持 FORTRAN 开发使用工具选项。返回值是 POSIX2_FORT_DEV 。
注意:1、 CLK_TCK 的值是可变的,因此,不应该假设它是一个 编译时间 常量
2、调用 setrlimit 会使 OPEN_MAX 的值发生改变。
3、 通过将 sysconf (_SC_PHYS_PAGES) 和 sysconf (_SC_PAGESIZE) 相乘,来确定 物理内存的总量 (以 字节为单位) 可以返回一个值,该值超出 32 位进程中 long 或 unsigned long 可表示的最大值。同样适用于通过将 sysconf (_SC_PAGESIZE) 和 sysconf (_SC_AVPHYS_PAGES) 想乘,来确定未使用的 物理内存的总量 (以 字节为单位)。这个问题有两个工作区。第 1 个工作区将程序作为 64 位的进程进行编译 (从而使 long 足够大到可以容纳乘法运算的结果) ,但是,这样做的缺点是得到的程序只能在 64 位的内核中运行。第 2 个工作区是用来将得到的乘法运算结果存储在一个 64 位的量中,如 longlong_t  (Solaris OS 类型) 或 long long (linux)。它的有点是可以在 32 位和 64 位的内核中正确工作。


cpu.h

/*
 * cpu.h
 *
 *  Created on: 2013-5-7
 *      Author: jason
 */

#ifndef CPU_H_
#define CPU_H_

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include<iostream>
using namespace std;

#define ONE_MB (1024 * 1024)

struct occupy
{
	char name[20];
	unsigned int user;
	unsigned int nice;
	unsigned int system;
	unsigned int idle;
};

class CCpu
{
public:
	CCpu();
	~CCpu();
	void getCpuUseRate();//CPU使用率
	double cal_occupy (struct occupy *o, struct occupy *n);
	void get_occupy (struct occupy *o);
	void getMemInfo(void);
	void printCpu();
private:
	double g_cpu_used[8];
	int cpu_num;
};


#endif /* CPU_H_ */

cpu.cpp

/*
 * cpu.cpp
 *
 *  Created on: 2013-5-7
 *      Author: jason
 */


#include"cpu.h"

CCpu::CCpu()
{}
CCpu::~CCpu()
{}
void CCpu::getCpuUseRate()
{
	struct occupy ocpu[10];
	struct occupy ncpu[10];
	int i;
	cpu_num = sysconf(_SC_NPROCESSORS_ONLN);
	get_occupy(ocpu);
	sleep(1);
	get_occupy(ncpu);
	for (i=0; i<cpu_num; i++)
	{
		  g_cpu_used[i] = cal_occupy(&ocpu[i], &ncpu[i]);
	}
}
double CCpu::cal_occupy (struct occupy *o, struct occupy *n)
{
	double od, nd;
    double id, sd;
    //double scale;
    double cpu_used;
    od = (double) (o->user + o->nice + o->system +
                    o->idle);
    nd = (double) (n->user + n->nice + n->system +
                    n->idle);
    //scale = 100.0 / (float)(nd-od);
    id = (double) (n->user - o->user);
    sd = (double) (n->system - o->system);
    cpu_used = ((sd+id)*100.0)/(nd-od);
    return cpu_used;
}
void CCpu::get_occupy (struct occupy *o)
{
    FILE *fd;
    int n;
    char buff[1024];
    fd = fopen ("/proc/stat", "r");
    fgets (buff, sizeof(buff), fd);
    for(n=0;n<cpu_num;n++)
    {
      fgets (buff, sizeof(buff),fd);
      sscanf (buff, "%s %u %u %u %u", &o[n].name, &o[n].user, &o[n].nice,&o[n].system, &o[n].idle);
      printf ("%s %u %u %u %u\n", o[n].name, o[n].user, o[n].nice,o[n].system, o[n].idle);
    }
   fclose(fd);
}
void CCpu::printCpu()
{
	getCpuUseRate();
	getMemInfo();
	for (int i=0; i<cpu_num; i++)
	{
		  cout<<"CPU["<<i<<"] 使用率";
		  cout<<g_cpu_used[i]<<"%"<<endl;
	}
}
void CCpu::getMemInfo(void)
{
    long num_procs;
    long page_size;
    long num_pages;
    long free_pages;
    long long  mem;
    long long  free_mem;
    float mem_per;
    num_procs = sysconf (_SC_NPROCESSORS_CONF);
    printf ("CPU 个数为: %ld 个\n", num_procs);
    page_size = sysconf (_SC_PAGESIZE);
    printf ("系统页面的大小为: %ld K\n", page_size / 1024 );
    num_pages = sysconf (_SC_PHYS_PAGES);
    printf ("系统中物理页数个数: %ld 个\n", num_pages);
    free_pages = sysconf (_SC_AVPHYS_PAGES);
    printf ("系统中可用的页面个数为: %ld 个\n", free_pages);
    mem = (long long) ((long long)num_pages * (long long)page_size);
    mem /= ONE_MB;
    free_mem = (long long)free_pages * (long long)page_size;
    free_mem /= ONE_MB;
    printf ("总共有 %lld MB 的物理内存, 空闲的物理内存有: %lld MB\n", mem, free_mem);
    mem_per = (mem-free_mem)*100.0/mem;
    printf ("内存占用率*100: %f\n", mem_per);
}


main.cpp

#include<iostream>
using namespace std;
#include"process.h"
#include"cpu.h"
int main(void)
{
	CCpu *pcpu = new CCpu;
	pcpu->printCpu();
	return 0;
}






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux系统中,获取CPU使用率内存使用率可以通过读取/proc/stat和/proc/meminfo文件来实现。下面是Linux平台下获取CPU使用率内存使用率的示例代码: 获取CPU使用率: ```c++ #include <fstream> #include <iostream> #include <sstream> #include <string> #include <unistd.h> using namespace std; double getCpuUsage() { static unsigned long long lastTotalUser, lastTotalUserLow, lastTotalSys, lastTotalIdle; ifstream fileStat("/proc/stat"); string line; getline(fileStat, line); istringstream ss(line); ss.ignore(5); // skip "cpu" word unsigned long long totalUser, totalUserLow, totalSys, totalIdle, totalIOwait, totalIRQ, totalSoftIRQ; ss >> totalUser >> totalUserLow >> totalSys >> totalIdle >> totalIOwait >> totalIRQ >> totalSoftIRQ; if (totalUser < lastTotalUser || totalUserLow < lastTotalUserLow || totalSys < lastTotalSys || totalIdle < lastTotalIdle) { // Overflow detection. Just skip this value. return -1.0; } unsigned long long total = totalUser - lastTotalUser + totalUserLow - lastTotalUserLow + totalSys - lastTotalSys; double cpuUsage = total; total += totalIdle - lastTotalIdle; cpuUsage /= total; lastTotalUser = totalUser; lastTotalUserLow = totalUserLow; lastTotalSys = totalSys; lastTotalIdle = totalIdle; return cpuUsage * 100.0; } int main() { while (true) { double cpuUsage = getCpuUsage(); cout << "CPU usage: " << cpuUsage << "%" << endl; usleep(1000000); } return 0; } ``` 获取内存使用率: ```c++ #include <fstream> #include <iostream> #include <sstream> #include <string> #include <unistd.h> using namespace std; double getMemoryUsage() { ifstream fileMem("/proc/meminfo"); string line; getline(fileMem, line); istringstream ss(line); ss.ignore(256, ' '); unsigned long long totalMem; ss >> totalMem; totalMem *= 1024; // convert to bytes getline(fileMem, line); ss.str(line); ss.clear(); ss.ignore(256, ' '); unsigned long long freeMem; ss >> freeMem; freeMem *= 1024; double memoryUsage = 100.0 * (totalMem - freeMem) / totalMem; return memoryUsage; } int main() { while (true) { double memoryUsage = getMemoryUsage(); cout << "Memory usage: " << memoryUsage << "%" << endl; usleep(1000000); } return 0; } ``` 以上示例代码只是提供了一个简单的思路,实际应用中还需要对获取到的数据进行处理和显示。另外,Linux系统提供了更为底层的API函数,如getrusage()和sysinfo()等,也可以用于获取系统资源使用情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值