linux系统的进程占用cpu信息监控C++

linux系统下的进程以及cpu信息都实时存储在/proc/stat文件里,只需要提取对应的时间信息就可以获取cpu的信息,进程的信息则存储在/proc/pid/stat。/proc/stat文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。该代码会一直运行,时间间隔为5s,进程cpu计算公式为:proc=((进程时间1-进程时间0)-(cpu时间1-cpu时间0))*100

公式转为C++为:

void conputing(unsigned long proc0,unsigned long  proc1,unsigned long  cpu0,unsigned long  cpu1)

{

        float proc;

        proc = 100*((proc1-proc0)-(cpu0-cpu1));

        return proc

下面的代码主要是提取信息并且存储在test.csv文件里。       

#include <iostream>
#include <fstream>
#include <unistd.h>
#include <sys/time.h>
#include <string.h>
#include <stdlib.h>
#include <cstdio>
#include <dirent.h>
#include <time.h>
#define Times 5000000
using namespace std;
   
 
DIR *pdir = NULL;
struct dirent *pde = NULL;

typedef struct{
    char name[16];
    unsigned long user;
    unsigned long nice;
    unsigned long system;
    unsigned long idle;
}CPU_OCCUPY;

typedef struct{
    unsigned int pid;
    unsigned long utime;
    unsigned long stime;
    unsigned long cutime;
    unsigned long cstime;
}Proc_Cpu;

//获取cpu的总时间
unsigned long get_cpu_total_time()
{
    FILE *fd;
    char buff[1024]={0};
    CPU_OCCUPY c;
    
    fd = fopen("/proc/stat","r");
    if(nullptr == fd)
    {
        return 0;
        cout << "open stat err" << endl;
    }
    fgets(buff,sizeof(buff),fd);
    char name[64] = {0};
    sscanf(buff,"%s %ld %ld %ld %ld",name,&c.user,&c.nice,&c.system,&c.idle);
    fclose(fd);
    return(c.user+c.nice+c.system+c.idle);
}

char pname[16] = {0};
unsigned long get_cpu_proc_time(unsigned int pid)
{
    char file_name[512] = {0};
    Proc_Cpu p;
    FILE *fd;
    char line_buff[1024] = {0};
    
    sprintf(file_name,"/proc/%d/stat",pid);
    //printf("%s\n",file_name);
    fd = fopen(file_name,"r");
    if(nullptr == fd)
    {
        cout << "file open err: " << file_name << endl;
        return 0;
    }
    fread(line_buff,1,sizeof(line_buff),fd);
    memset(pname,0,sizeof(pname));
    sscanf(line_buff,"%u (%s)",&p.pid,pname);
    pname[strlen(pname)-1] = 0;
    sscanf(line_buff,"%*u%*s%*s%*d%*d%*d%*d%*d%*d%*d%*d%*d%*d%ld%ld%ld%ld",&p.utime,&p.stime,&p.cutime,&p.cstime);
    fclose(fd);
    return(p.utime+p.stime+p.cutime+p.cstime);
    
}


int main()
{
    ofstream outFile;
    outFile.open("test.csv",ios::out);
    outFile << "name" << "," << "pid" << "," << "cpu_time0" << "," << "proc_time0" << "," << "cpu_time1" << "," << "proc_time1" << "," << "pid_num" << "," << "time" <<endl;
    outFile.close();
    ofstream outFile2;
    outFile2.open("test1.csv",ios::out);
    //outFile2 << "name" << "," << "pid" << "," << "cpu_time0" << "," << "proc_time0" << "," << "cpu_time1" << "," << "proc_time1" << "," << "pid_num" << "," << "time" << endl;
    outFile2 << "name" << "," << "pid" << "," << "time" << "," << "pid_data" <<endl;
    outFile2.close();
    ofstream outFile1;
    outFile1.open("result.csv",ios::out);
    outFile1 << "average" <<"," << "pid1" << "," <<"data_name" << endl;
    outFile1.close();
    while(1)
    {
        time_t timep;
        
        
        unsigned int pid_name[1024] = {0};
        string pid_buff[512];
        unsigned long cpu_time0[1024] = {0};
        unsigned long proc_time0[1024] = {0};
        unsigned long cpu_time1[1024] = {0};
        unsigned long proc_time1[1024] = {0};
        int pid_num = 0;//进程个数
        //ofstream outFile; //csv
        outFile.open("test.csv",ios::out | ios::app);
        //outFile2.open("test1.csv",ios::out | ios::app);
        //outFile << "name" << "," << "pid" << "," << "cpu_time0" << "," << "proc_time0" << "," << "cpu_time1" << "," << "proc_time1" << endl;
        pdir = opendir("/proc");
        if(!pdir){
            cout << "proc open err!" << endl;
            return 0;
        }
        int i =0;
        while(pde = readdir(pdir)){
            if((pde->d_name[0] < '0') || (pde->d_name[0] > '9')){
                continue;
            }
            else{
                pid_name[i] = atoi(pde->d_name);
                //cout << pid_name[i] << endl;
                i++;
                pid_num++;
            }
        }
        cout << "总进程的个数: " << pid_num << endl;
        closedir(pdir);
        for(int j =0 ; j<pid_num ; j++){
            cpu_time0[j] = get_cpu_total_time();
            proc_time0[j] = get_cpu_proc_time(pid_name[j]);
            pid_buff[j] = pname;
        }
        usleep(Times);
        for(int k =0 ; k<pid_num ;k++){
            cpu_time1[k] = get_cpu_total_time();
            proc_time1[k] = get_cpu_proc_time(pid_name[k]);
        
        }
        time(&timep);
        char temp[64];
        strftime(temp,sizeof(temp),"%H:%M:%S",localtime(&timep));
        for(int n=0 ;n<pid_num ; n++){
            outFile << pid_buff[n] << "," << pid_name[n] << "," << cpu_time0[n] << "," << proc_time0[n] << "," << cpu_time1[n] << "," << proc_time1[n] << "," << pid_num << "," << temp << endl;
            //outFile2 << pid_buff[n] << "," << pid_name[n] << ","  << temp << endl;
        }
        //outFile2 << "end" << "," << "end" << "," << "end" << "," << "end" << "," << "end" << "," << "end" << "," << "end" << endl;
        //outFile2.close();
        outFile.close();
        usleep(Times);
    }
        
}
   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值